2

今日、私はZend-Frameworkのバグと思われる問題に遭遇しました。次のルートが与えられます:

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

および3つのURL:

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

最後のURLが一致しないため、正しいコントローラーが呼び出されません。誰かがなぜ手がかりを得たのですか?

Fyi、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-modifierはアジアのキャラクターを操作するためのものです。私はそれらを使用しないので、私は知っているそのパッチで大丈夫です。読んでくれてありがとう。

4

3 に答える 3

2
于 2011-06-23T10:06:00.017 に答える
1

問題は次のとおりです。

/u パターン修飾子を使用すると、単語がマングルされるのを防ぎますが、代わりに PCRE はコード値が 127 より大きい文字列をスキップします。したがって、\w はマルチバイト (非下位 ASCII) 単語とはまったく一致しません (ただし、返されません)。一部)。pcrepattern の man ページから;

UTF-8 モードでは、値が 128 より大きい文字は \d、\s、または \w と一致せず、常に \D、\S、および \W と一致します。これは、Unicode 文字プロパティのサポートが利用可能な場合でも当てはまります。

PHP での UTF-8 の処理から。したがって、URL が ISO-8859-1 でエンコードされている (mysite.local/citytest/M%FCnchen) か、UTF-8 でエンコードされている (mysite.local/citytest/M%C3%BCnchen) かは実際には関係ありません。デフォルトの正規表現はそうではありません。マッチ。

また、Zend Framework の URL でウムラウトを使用して実験を行い、URL にウムラウトを使用する必要はないという結論に達しました。問題は、ブラウザが URL に使用するエンコーディングに依存できないことです。たとえば、Firefox (3.0 より前) は、アドレス テキストボックスに入力された URL を UTF-8 エンコードしません (about:config で指定されていない場合)。IE のオプションには、URL の通常のエンコードと UTF-8 エンコードのどちらかを選択するためのチェックボックスがあります。 . ただし、ページ内のリンクをクリックすると、両方のブラウザが指定されたエンコーディング (UTF-8 ページでは UTF-8) で URL を使用します。したがって、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, '-');
}
于 2008-09-27T18:25:27.770 に答える
1

u 修飾子は、正規表現が utf-8 入力を期待するようにします。これは、ZF が ISO-8859-1 ではなく、utf-8 でエンコードされた入力を想定していることを示唆しています (私は ZF にあまり詳しくないので、ここでは推測しています)。

その場合は、URL で使用する前にutf-8 エンコードする必要があります。üその後、次のようになります。mysite.local/citytest/M%C3%BCnchen

アプリケーションの残りの部分はおそらく ISO-8859-1 (PHP <= 5 のデフォルト) を話すため、変数を使用する前にutf8_decodeで明示的にデコードする必要があることに注意してください。

于 2008-09-24T15:19:03.747 に答える