مشكلة المسار فيما يتعلق بعلامات تغير الصوت المشفرة بعنوان URL (باستخدام إطار عمل Zend)

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

  •  02-07-2019
  •  | 
  •  

سؤال

لقد تعثرت اليوم بشأن مشكلة يبدو أنها خطأ في Zend-Framework.بالنظر إلى المسار التالي:

<test>
    <route>citytest/:city</route>
    <defaults>
        <controller>result</controller>
        <action>test</action>
    </defaults>
    <reqs>
        <city>.+</city>
    </reqs>
</test>

وثلاثة عناوين URL:

  • mysite.local/citytest/Berlin
  • mysite.local/citytest/Hamburg
  • mysite.local/citytest/M%FCnchen

عنوان URL الأخير غير متطابق وبالتالي لا يتم استدعاء وحدة التحكم الصحيحة.هل حصل أحد على فكرة لماذا؟

لمعلوماتك، أين نستخدم Zend-Framework 1.0 (نعم، أعلم أن هذا قديم ولكني لست مسؤولاً عن تغيير ذلك :-/)

يحرر:ومما سمعته، سنقوم بالترقية إلى Zend 1.5.6 قريبًا، لكنني لا أعرف متى، لذا سيكون التصحيح رائعًا.

يحرر:لقد قمت بتتبعه وصولاً إلى السطر التالي (Zend/Controller/Router/Route.php:170):

$regex = $this->_regexDelimiter . '^' . 
  $part['regex'] . '$' . 
  $this->_regexDelimiter . 'iu';

إذا قمت بتغيير ذلك إلى

  $this->_regexDelimiter . 'i';

إنها تعمل.حسب ما أفهمه، فإن مُعدِّل u مخصص للعمل مع الشخصيات الآسيوية.نظرًا لأنني لا أستخدمها، فأنا بخير مع هذا التصحيح لمعرفة ذلك.شكرا للقراءة.

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

المحلول

المشكلة هي ما يلي:

يمنع استخدام معدّل نمط /U الكلمات من التشويش ولكن بدلاً من ذلك يتخطى PCRE سلاسل من الأحرف ذات قيم التعليمات البرمجية أكبر من 127.لذلك ، لن يتطابق W مع كلمة Multibyte (غير محفوظة ASCII) على الإطلاق (ولكن أيضًا لن تُرجع أجزاء منها).من صفحة الرجل pcrepattern؛

في وضع UTF-8 ، لا تتطابق الأحرف ذات القيم التي تزيد عن 128 أبدًا إلى d ، s ، أو w ، وتطابق دائمًا d ، s ، و w.هذا صحيح حتى عندما يتوفر دعم خاصية Unicode للحرف.

من التعامل مع UTF-8 مع PHP.لذلك، لا يهم في الواقع إذا كان عنوان URL الخاص بك مشفرًا بـ ISO-8859-1 (mysite.local/citytest/M%FCnchen) أو بترميز UTF-8 (mysite.local/citytest/M%C3%BCnchen)، فلن يكون التعبير العادي الافتراضي مباراة.

لقد قمت أيضًا بإجراء تجارب مع علامات تغير الصوت في عناوين URL في Zend Framework وتوصلت إلى نتيجة مفادها أنك لا تريد حقًا علامات تغير الصوت في عناوين URL الخاصة بك.تكمن المشكلة في أنه لا يمكنك الاعتماد على الترميز الذي يستخدمه المتصفح لعنوان URL.على سبيل المثال، لا يقوم Firefox (قبل الإصدار 3.0) بتشفير UTF-8 لعناوين URL التي تم إدخالها في مربع نص العنوان (إذا لم يتم تحديدها في about:config) كما أن IE لديه مربع اختيار ضمن خياراته للاختيار بين التشفير العادي وUTF-8 لعناوين URL الخاصة به .ولكن إذا قمت بالنقر فوق الروابط الموجودة داخل الصفحة، فسيستخدم كلا المتصفحين عنوان URL بالتشفير المحدد (UTF-8 على صفحة UTF-8).لذلك لا يمكنك التأكد من التشفير الذي يتم إرسال عناوين URL إلى تطبيقك - كما أن اكتشاف التشفير المستخدم ليس بالأمر الهين.

ربما يكون من الأفضل استخدام معلمات مكتوبة بأحرف صوتية في عناوين URL الخاصة بك (على سبيل المثال:تغيير Ä إلى Ae وهكذا).هناك طريقة بسيطة حقًا للقيام بذلك (لا أعرف ما إذا كانت هذه الطريقة تعمل مع كل اللغات ولكني أستخدمها مع السلاسل الألمانية وهي تعمل جيدًا):

function createUrlFriendlyName($name) // $name must be an UTF-8 encoded string
{
    $name=mb_convert_encoding(trim($name), 'HTML-ENTITIES', 'UTF-8');
    $name=preg_replace(
        array('/&szlig;/', '/&(..)lig;/', '/&([aouAOU])uml;/', '/&(.)[^;]*;/', '/\W/'),
        array('ss', '$1', '$1e', '$1', '-'),
        $name);
    $name=preg_replace('/-{2,}/', '-', $name);
    return trim($name, '-');
}

نصائح أخرى

يرجى العمل بشكل مثالي بالنسبة لي

/^[\p{L}-. ]*$/u
  • ^ بداية السلسلة
  • [ ... ]* صفر أو أكثر مما يلي:
  • \p{L} أحرف حرف Unicode
  • شرطات
  • . فترات
  • المساحات
  • $ نهاية السلسلة
  • /u تمكين وضع Unicode في PHP

مثال:

$str= ‘Füße’;
if (!preg_match(“/^[\p{L}-. ]*$/u”, $str))
{
    echo ‘error’;
}
else
{
    echo “success”;
}

معدّل u يجعل التعبير العادي يتوقع إدخال utf-8.قد يشير هذا إلى أن ZF تتوقع إدخالاً مشفرًا بـ utf-8، وليس ISO-8859-1 (لست على دراية بـ ZF، لذا فأنا أخمن هنا فقط).

إذا كان هذا هو الحال، سيكون لديك ل ترميز utf-8 ال ü قبل استخدامه في عنوان URL.فيصبح بعد ذلك: mysite.local/citytest/M%C3%BCnchen

لاحظ أنه نظرًا لأن بقية تطبيقك ربما يتحدث ISO-8859-1 (وهو الإعداد الافتراضي لـ PHP <= 5)، فسيتعين عليك فك تشفير المتغير بشكل صريح باستخدام utf8_decode, ، قبل أن تتمكن من استخدامه.

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