كيف يمكن أن أحصل على عنوان بريد إلكتروني من سلسلة من key=قيمة أزواج ؟

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

سؤال

كيف يمكنني الحصول على جزء من السلسلة التي أريد ؟

accountid=xxxxxx type=بريم servertime=1256876305 addtime=1185548735 validuntil=1265012019 اسم المستخدم=مستجد directstart=1 protectfiles=0 rsantihack=1 plustrafficmode=1 المرايا= jsconfig=1 email=noob@live.com الكثير=0 fpoints=6076 ppoints=149 curfiles=38 curspace=3100655714 bodkb=60000000 premkbleft=25000000 ppointrate=116

أريد البيانات بعد email= ولكن حتى live.com.?

هل كانت مفيدة؟

المحلول

هناك عدة طرق للقيام بذلك.هل يمكن تقسيم السلسلة على حرف مسافة ثم تطورت TStringList.ثم يمكنك استخدام TStringList قيمة[سلسلة] الخاصية للحصول على قيمة اسم معين.

تفعل ذلك ، سلسلة استبدال جميع المساحات مع الفواصل:

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

ثم استيراد يؤدي إلى TStringList:

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

هذا وسوف تعطيك البريد الإلكتروني القيمة.ثم ستحتاج إلى تقسيم السلسلة في رمز "@" وهو تافهة نسبيا ممارسة الرياضة.بالطبع, هذا يعمل فقط إذا المساحات حقا محدد بين الحقول.

وبدلا من ذلك يمكن استخدام تعبير عادي ولكن دلفي لا يدعم هذه أصلا (أنت تحتاج regex المكتبة - انظر هنا)

*** تحطيم أشار (D2006+) محدد / النص المحدد الذي سوف ننظر بشيء من هذا القبيل:

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

نصائح أخرى

فكرتي:

  1. استبدال المساحات مع CRLF (فمن مساحة فصل)
  2. تحميل في TStringList
  3. استخدام القيم الملكية مع "البريد الإلكتروني" اسم

التعليمة البرمجية التالية لا تعمل إلا إذا كانت القيم لا تحتوي على مسافات:

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;

فكرة أخرى يمكن أيضا استخدام PosEx (StrUtils) مع 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;

الاستخدام:

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

بالطبع هذا سوف تعمل فقط إذا كان المصدر سلسلة مهيأ دائما بنفس الطريقة ، سيكون مفيد استخراج البيانات الأخرى حسب الحاجة.

على افتراض أن السلسلة التي عقدت في متغير 's' و 'tmp' هو آخر سلسلة متغير ،

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

'tmp' تعقد العنوان

تقسيم السلسلة إلى مجموعة من السلسلة ، باستخدام '=' كما deliminator, ثم سيكون لديك مجموعة في هذا النظام:'مفتاح' ثم 'قيمة' هل يمكن بعد ذلك حلقة من خلال البحث عن "البريد الإلكتروني" مفتاح ثم ببساطة إضافة 1 إلى مؤشر مجموعة للحصول على قيمة.ولكن هذا يمكن أن تفشل في الكثير من الطرق (على سبيل المثال بعض واحد يدخل '=' كما حرف) أو هناك سلاسل فارغة في حقل القيمة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top