¿Cómo puedo obtener una dirección de correo electrónico de una cadena de pares clave = valor?

StackOverflow https://stackoverflow.com/questions/1649071

Pregunta

¿Cómo puedo obtener alguna parte de la cadena que necesito?

accountid = xxxxxx type = prem servertime = 1256876305 addtime = 1185548735 validuntil = 1265012019 username = noob directstart = 1 protectfiles = 0 rsantihack = 1 plustrafficmode = 1 mirrors = jsconfig = 1 email=noob@live.com lotes = 0 fpoints = 6076 puntos = 149 curfiles = 38 curspace = 3100655714 bodkb = 60000000 premkbleft = 25000000 ppointrate = 116

Quiero datos después del correo electrónico = pero hasta live.com.

¿Fue útil?

Solución

Hay un par de formas de hacer esto. Puede dividir la cadena en el carácter de espacio y luego alimentarlo en TStringList. Luego puede usar la propiedad Value [String] de TStringList para obtener el valor de un nombre dado.

Para hacer eso, reemplace una cadena de todos los espacios con comas:

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

Luego importe el resultado en una TStringList:

var
  MyStringList : TStringList;
begin
  MyStringList := TStringList.Create;
  try
    MyStringList.CommaText := StringReplace(oldString, ' ', ',', [rfReplaceAll]);
    Result := MyStringList.Values['email'];
  finally
    MyStringList.Free;
  end;
end;

Esto le dará el valor del correo electrónico. Luego deberá dividir la cadena en " @ " símbolo que es un ejercicio relativamente trivial. Por supuesto, esto solo funciona si los espacios son realmente un delimitador entre campos.

Alternativamente, podría usar una expresión regular, pero Delphi no las admite de forma nativa (necesitaría una biblioteca de expresiones regulares; consulte aquí )

*** Smasher observó (D2006 +) Delimitador / Texto delimitado que se vería así:

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

Otros consejos

Mi idea:

  1. reemplazar espacios con CRLF (es un espacio separado)
  2. cargar en TStringList
  3. propiedad de valores de uso con nombre de 'correo electrónico'

El siguiente código solo funciona si los valores no contienen espacios:

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;

Otra idea, también puede usar PosEx (StrUtils) con el texto 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;

Uso:

ExtractMyString(StringList.Text, 'email=', ' lots=');

Por supuesto, esto solo funcionará si la cadena de origen siempre se formatea de la misma manera, sería útil para extraer los otros datos según sea necesario.

suponiendo que la cadena se mantiene en la variable 's', y 'tmp' es otra variable de cadena,

i:= pos ('email=', s);
tmp:= '';
inc (i);
while s[i] <> ' ' do
 begin
  tmp:= tmp + s[i]; 
  inc (i);
 end;

'tmp' mantendrá la dirección

Divida la cadena en una matriz de cadenas, usando el '=' como deliminador, entonces tendrá una matriz en este orden: 'Clave' y luego 'Valor' que luego podría recorrer buscando el 'correo electrónico' luego simplemente agregue 1 al índice de la matriz para obtener el valor. Pero esto podría fallar de muchas maneras (por ejemplo, alguien ingresa '=' como carácter) o hay cadenas vacías en el campo de valor

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top