كيف يمكن أن أحصل على عنوان بريد إلكتروني من سلسلة من key=قيمة أزواج ؟
-
22-07-2019 - |
سؤال
كيف يمكنني الحصول على جزء من السلسلة التي أريد ؟
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'];
نصائح أخرى
فكرتي:
- استبدال المساحات مع CRLF (فمن مساحة فصل)
- تحميل في TStringList
- استخدام القيم الملكية مع "البريد الإلكتروني" اسم
التعليمة البرمجية التالية لا تعمل إلا إذا كانت القيم لا تحتوي على مسافات:
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 إلى مؤشر مجموعة للحصول على قيمة.ولكن هذا يمكن أن تفشل في الكثير من الطرق (على سبيل المثال بعض واحد يدخل '=' كما حرف) أو هناك سلاسل فارغة في حقل القيمة