تعبير PHP العادي لتصفية الخردة
سؤال
لذلك لدي مشكلة مثيرة للاهتمام: لديّ سلسلة ، وبالنسبة للجزء الأكبر ، أعرف ما أتوقعه:
http://www.someurl.com/st=????????
إلا في هذه الحالة ، فإن؟ هي إما الحروف أو الأرقام العلوية. المشكلة هي أن السلسلة قد تم خلطها في: يتم تقسيم السلسلة إلى 5 أو 6 قطع ، وبين وجود الكثير من الشخصيات غير القابلة للطباعة ، والأحرف الأجنبية ، وكذلك الشخصيات العادية القديمة العادية. باختصار ، أشياء مناسبة لتبدو كما هي: nyÞ = mî ؛ ëmý × nüqï
عادةً ما تكون الأحرف الثمانية الأخيرة ("؟" معًا في النهاية ، لذلك في الوقت الحالي ، حصلت على PHP فقط آخر 8 Chars وأمل في الأفضل. في بعض الأحيان ، هذا لا يعمل ، لذلك أحتاج إلى حل أكثر قوة.
المشكلة غير قابلة للحل تقنيًا ، لكنني أعتقد أن أفضل حل هو الاستيلاء على الأحرف من نهاية السلسلة أثناء وجودها العلوي أو الرقمي. إذا حصلت على 8 أو أكثر ، افترض أن هذا صحيح. خلاف ذلك ، ابحث عن الأحرف ST = و GROP للمضي قدمًا بقدر ما أحتاج إلى ملء حصة الأحرف المكونة من 8 أحرف. هل هناك طريقة regex للقيام بذلك أم سأحتاج إلى تكوين الأكمام والذهاب إلى نمط الحلقة المتداخلة؟
تحديث:
لتوضيح بعض الالتباس ، أحصل على سلسلة إدخال مثل هذا:
[garbage]http:/[garbage]/somewe[garbage]bsite.co[garbage]m/something=[garbage]????????
باستثناء القمامة في مواقع غير متوقعة في السلسلة (باستثناء النهاية لا تكون القمامة أبدًا) ، ولديها طول لا يمكن التنبؤ بها (على الأقل ، تمكنت من العثور على أنماط في أي منهما). عادة ما تكون جميعها معًا ، ومن ثم أنا فقط أستحوذ على آخر 8 chars ، لكن في بعض الأحيان لا تؤدي إلى بعض البيانات المفقودة والقمامة التي تم إرجاعها:-
المحلول
$var = '†http://þ=www.ex;üßample-website.î;ëcomÝ×ü/joy_hÏere.html'; // test case
$clean = join(
array_filter(
str_split($var, 1),
function ($char) {
return (
array_key_exists(
$char,
array_flip(array_merge(
range('A','Z'),
range('a','z'),
range((string)'0',(string)'9'),
array(':','.','/','-','_')
))
)
);
}
)
);
ههه ، كانت هذه مزحة. هذا regex لك:
$clean = preg_replace('/[^A-Za-z0-9:.\/_-]/','',$var);
نصائح أخرى
كما ذكر ، المشكلة غير قابلة للحل. إذا كانت القمامة يمكن أن تحتوي على أحرف "أحرف عادية قديمة عادي" ، ويمكن أن تسقط القمامة في نهاية السلسلة ، فلا يمكنك معرفة ما إذا كانت السلسلة المستهدفة من هذه العينة هي "ABCDEFGH" أو "BCDEFGHI":
__http:/____/somewe___bsite.co____m/something=__ABCDEFGHI__
ماذا تمثل هذه القيم؟ إذا كنت ترغب في الاحتفاظ بكل ذلك ، فقط دون الحاجة إلى التعامل مع القمامة في قاعدة البيانات الخاصة بك ، ربما يجب عليك تعديلها باستخدامها باستخدام Bin2Hex ().
يمكنك استخدام هذا التعبير العادي:
if (preg_match ('/['^£ $ ٪ &*()} {@#~؟> <> ، | = _+¬-]/'، $ string) == 1)