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.?

Était-ce utile?

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:

  1. remplace les espaces par CRLF (c’est séparé de l’espace)
  2. charger dans TStringList
  3. 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top