2009-10-30 20 views
5

Comment puis-je obtenir une partie de la chaîne dont j'ai besoin?Comment puis-je obtenir une adresse e-mail à partir d'une chaîne de paires clé = valeur?

accountid = type de xxxxxx = prem servertime = 1256876305 AddTime = 1185548735 1265012019 validuntil = UserName = Noob directstart = 1 protectfiles = 0 rsantihack = 1 = 1 plustrafficmode miroirs = jsconfig = 1 [email protected] feux = 0 fpoints = 6076 ppoints = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Je veux des données après l'email = mais de jusqu'à live.com.?

+1

Pourquoi downvote? Ceci est une question valide à mon humble avis. – jpfollenius

+0

ouais, mais vous pourriez avoir juste cherché le mot d'email, passez le '=', bouclez chaque caractère jusqu'à ce que vous frappiez le @ ... – Skuta

+0

Non, parce que 'email' peut se produire n'importe où - dans une ancienne valeur, dans un ancien nom de la propriété ... – jpfollenius

Répondre

11

Il y a plusieurs façons de le faire. Vous pouvez diviser la chaîne sur le caractère espace, puis le nourrir dans TStringList. Vous pouvez ensuite utiliser la propriété Value [String] de TStringList pour obtenir la valeur d'un nom donné.

Pour ce faire, faire une chaîne de remplacer tous les espaces par des virgules:

newString := StringReplace(oldString, ' ', ',', [rfReplaceAll]); 

importer ensuite le résultat dans un 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 e-mail. Vous devrez ensuite diviser la chaîne au symbole "@" qui est un exercice relativement trivial. Bien sûr, cela ne fonctionne que si les espaces sont vraiment un délimiteur entre les champs.

Sinon, vous pouvez utiliser une expression régulière, mais Delphi ne prend pas en charge les nativement (vous auriez besoin d'une bibliothèque regex - voir here)

*** Smasher noté (D2006 +) Délimiteur/texte Délimité qui examinerait quelque chose comme ceci:

MyStringList.Delimiter := ' '; 
MyStringList.DelimitedText := oldString; 
Result := MyStringList.Values['email']; 
+1

+1 Bonne solution. Je ne connaissais pas la propriété 'Values'. Vous pouvez simplement utiliser 'StringList.Delimiter' et' StringList.DelimitedText' au lieu de remplacer les espaces par des virgules. – jpfollenius

+3

La propriété CommaText ne nécessite pas de séparer les enregistrements par des virgules. Les caractères d'espaces blancs feront aussi bien, donc vous n'avez pas besoin de convertir les espaces en virgules. Il est préférable de définir DelimitedText avec StrictDelimiter sur true. Ensuite, vous êtes autorisé à avoir des virgules dans les clés ou les valeurs. –

1

Le code suivant ne fonctionne que si les valeurs ne contiennent pas d'espaces:

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; 
2

Mon idée:

  1. remplacer les espaces par CRLF (ce qu'il est un espace séparé)
  2. charge dans TStringList
  3. utilise la propriété values ​​avec le nom 'email'
0

diviser la chaîne en un tableau de chaîne, en utilisant le « = » comme deliminator, vous aurez alors un tableau dans cet ordre: « Key » puis « Value » vous pourriez parcourez en cherchant la clé 'email' puis ajoutez simplement 1 à l'index du tableau pour obtenir la valeur. Mais cela pourrait échouer dans beaucoup de façons (par exemple, quelqu'un entre dans « = » comme un caractère) ou il y a des chaînes vides dans le champ de valeur

1

Une autre idée, vous pouvez aussi 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é de la même façon, serait à portée de main pour extraire les autres données nécessaires.

1

en supposant que la chaîne est maintenue dans la variable 's' et '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' tiendra l'adresse