سؤال

لذلك لدي مشكلة مثيرة للاهتمام: لديّ سلسلة ، وبالنسبة للجزء الأكبر ، أعرف ما أتوقعه:

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)

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