Comment puis-je obtenir une adresse de messagerie d'une chaîne de paires clé = valeur?
-
22-07-2019 - |
Question
Comment puis-je obtenir une partie de la chaîne dont j'ai besoin?
accountid = xxxxxx type = premservertime = 1256876305 addtime = 1185548735 validuntil = 1265012019 nom d'utilisateur = noob directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 mirrors = jsconfig = 1 email=noob@live.com lots = 0 points = 6076 points = 149 courbes = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116
Je veux des données après l'email = mais jusqu'à live.com.?
La solution
Il y a plusieurs façons de procéder. Vous pouvez diviser la chaîne sur le caractère d'espace puis l'envoyer dans TStringList. Vous pouvez ensuite utiliser la propriété Value [String] de TStringList pour obtenir la valeur d'un nom donné.
Pour ce faire, remplacez tous les espaces par une chaîne avec une chaîne:
newString := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
Importez ensuite le résultat dans une liste TStringList:
var
MyStringList : TStringList;
begin
MyStringList := TStringList.Create;
try
MyStringList.CommaText := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
Result := MyStringList.Values['email'];
finally
MyStringList.Free;
end;
end;
Cela vous donnera la valeur email. Vous devrez ensuite fractionner la chaîne au niveau du " @ " symbole qui est un exercice relativement trivial. Bien entendu, cela ne fonctionne que si les espaces sont véritablement un délimiteur entre les champs.
Vous pouvez également utiliser une expression régulière mais Delphi ne la prend pas en charge de manière native (vous aurez besoin d’une bibliothèque regex - voir ici )
*** Smasher a noté (D2006 +) Délimiteur / texte délimité qui ressemblerait à ceci:
MyStringList.Delimiter := ' ';
MyStringList.DelimitedText := oldString;
Result := MyStringList.Values['email'];
Autres conseils
Mon idée:
- remplace les espaces par CRLF (c’est séparé de l’espace)
- charger dans TStringList
- utiliser la propriété values ??avec le nom 'email'
Le code suivant ne fonctionne que si les valeurs ne contiennent aucun espace:
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;
Une autre idée, vous pouvez également utiliser PosEx (StrUtils) avec le texte 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;
Utilisation:
ExtractMyString(StringList.Text, 'email=', ' lots=');
Bien sûr, cela ne fonctionnera que si la chaîne source est toujours formatée de la même manière, ce qui serait pratique pour extraire les autres données en fonction des besoins.
en supposant que la chaîne est conservée dans la variable 's' et que 'tmp' est une autre variable de chaîne,
i:= pos ('email=', s);
tmp:= '';
inc (i);
while s[i] <> ' ' do
begin
tmp:= tmp + s[i];
inc (i);
end;
'tmp' contiendra l'adresse
Divisez la chaîne en un tableau de chaînes, en utilisant le '=' comme délimiteur, vous obtiendrez alors un tableau avec dans cet ordre: 'Clé' puis 'Valeur' ??que vous pourriez alors parcourir en recherchant le 'email' puis ajoutez simplement 1 à l'index du tableau pour obtenir la valeur. Mais cela pourrait échouer de nombreuses manières (par exemple, une personne entre "=" en tant que caractère) ou il y a des chaînes vides dans le champ de valeur