Come posso ottenere un indirizzo e-mail da una stringa di coppie chiave = valore?
-
22-07-2019 - |
Domanda
Come posso ottenere una parte della stringa di cui ho bisogno?
accountid = xxxxxx type = prem servertime = 1256876305 addtime = 1185548735 validuntil = 1265012019 username = noob directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 mirror = jsconfig = 1 email=noob@live.com lot = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116
Voglio i dati dopo l'e-mail = ma fino a live.com.?
Soluzione
Ci sono un paio di modi per farlo. È possibile dividere la stringa sul carattere spazio e quindi inserirla in TStringList. È quindi possibile utilizzare la proprietà Value [String] di TStringList per ottenere il valore di un determinato nome.
Per fare ciò, fai una sostituzione di stringa di tutti gli spazi con virgole:
newString := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
Quindi importare il risultato in un TStringList:
var
MyStringList : TStringList;
begin
MyStringList := TStringList.Create;
try
MyStringList.CommaText := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
Result := MyStringList.Values['email'];
finally
MyStringList.Free;
end;
end;
Questo ti darà il valore dell'email. Dovrai quindi dividere la stringa in " @ " simbolo che è un esercizio relativamente banale. Ovviamente, questo funziona solo se gli spazi sono veramente delimitatori tra i campi.
In alternativa potresti usare un'espressione regolare ma Delphi non supporta quelli nativi (avresti bisogno di una libreria regex - vedi qui )
*** Smasher notato (D2006 +) Delimitatore / Testo delimitato che assomiglierebbe a questo:
MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];
Altri suggerimenti
La mia idea:
- sostituisce gli spazi con CRLF (è spazio separato)
- carica in TStringList
- usa la proprietà valori con il nome "email"
Il seguente codice funziona solo se i valori non contengono spazi:
uses
StrUtils, Classes;
....
function GetPropertyValue (const PropertyName : String; const InputString : String) : String;
var
StringList : TStringList;
Str : String;
begin
Result := '';
StringList := TStringList.Create;
try
StringList.Delimiter := ' ';
StringList.DelimitedText := InputString;
for Str in StringList do
if StartsText (PropertyName + '=', Str) then
Result := RightStr (Str, Length (Str) - Length (PropertyName) - 1);
finally
FreeAndNil (StringList);
end;
end;
Un'altra idea, potresti anche usare PosEx (StrUtils) con il testo StringList:
function ExtractMyString(SrcStr, FromStr, ToStr: string): string;
var
posBeg, posEnd: integer;
begin
Result := '';
posBeg := Pos(FromStr, SrcStr) + Length(FromStr);
posEnd := PosEx(ToStr, SrcStr, posBeg);
if (posBeg > 0) and (posEnd > posBeg) then
Result := Copy(SrcStr, posBeg, posEnd-posBeg);
end;
Utilizzo:
ExtractMyString(StringList.Text, 'email=', ' lots=');
Ovviamente funzionerà solo se la stringa di origine è sempre formattata nello stesso modo, sarebbe utile per estrarre gli altri dati quando necessario.
supponendo che la stringa sia mantenuta nella variabile 's' e 'tmp' sia un'altra variabile di stringa,
i:= pos ('email=', s);
tmp:= '';
inc (i);
while s[i] <> ' ' do
begin
tmp:= tmp + s[i];
inc (i);
end;
'tmp' conterrà l'indirizzo
Dividi la stringa in un array di stringhe, usando '=' come delimitatore, avrai quindi un array con in questo ordine: 'Key' quindi 'Value', quindi puoi scorrere cercando la 'email' quindi aggiungere semplicemente 1 all'indice dell'array per ottenere il valore. Ma questo potrebbe fallire in molti modi (es. Qualcuno inserisce '=' come carattere) o ci sono stringhe vuote nel campo valore