2

各都市名がリンクされ、この都市のページを参照している都市のリストを取得したいのですが、次のようになります。

ここに画像の説明を入力してください

リンク(ビュースクリプトで作成)は次のようになります。

http://project.loc/catalog/Berlin (in the HTML source code url-encoded: Berlin)
http://project.loc/catalog/Erlangen (in the HTML source code url-encoded: Erlangen)
http://project.loc/catalog/Nürnberg (in the HTML source code url-encoded: N%C3%BCrnberg)

「ベルリン」、「エアランゲン」などは機能しますが、都市名に「ニュルンベルク」のようなドイツ語の特殊文字(、、、、、、、、または)が含まれている場合、404エラーがä発生しますöüÄÖÜß

404エラーが発生しましたページが見つかりません。要求されたURLはルーティングによって一致しませんでした。利用可能な例外はありません

なんで?そして、これを機能させる方法は?

前もって感謝します!

編集:

私のルーター設定:

'router' => array(
    'routes' => array(
        'catalog' => array(
            'type'  => 'literal',
            'options' => array(
                'route' => '/catalog',
                'defaults' => array(
                    'controller' => 'Catalog\Controller\Catalog',
                    'action'     => 'list-cities',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'city' => array(
                    'type'  => 'segment',
                    'options' => array(
                        'route' => '/:city',
                        'constraints' => array(
                            'city'  => '[a-zA-ZäöüÄÖÜß0-9_-]*',
                        ),
                        'defaults' => array(
                            'controller' => 'Catalog\Controller\Catalog',
                            'action'     => 'list-sports',
                        ),
                    ),
                    'may_terminate' => true,
                    'child_routes' => array(
                    // ...
                    ),
                ),
            ),
        ),
    ),
),
4

1 に答える 1

2

制約を変更する必要があります。UTF8文字に一致する正規表現を使用できます。次のようになります。

'/[\p{L}]+/u'

/ u修飾子(unicode)に注意してください。

編集:

問題は解決しました。

説明:

RegExルートはURIをpreg_match(...)(Zend \ Mvc \ Router \ Http \ Regexの116行目または118行目)と一致させます。「特殊文字」(128+)を使用して文字列をマッハするには、パターン修飾子uをに渡す必要がありpreg_match(...)ます。このような:

$thisRegex = '/catalog/(?<city>[\p{L}]*)';
$regexStr = '(^' . $thisRegex . '$)u'; // <-- here
$path = '/catalog/Nürnberg';
$matches = array();
preg_match($regexStr, $path, $matches);

また、RegEx RouteはURLでエンコードされた文字列をに渡すためpreg_match(...)、最初に文字列をデコードするためにさらにモードが必要です。

$thisRegex = '/catalog/(?<city>[\p{L}]*)';
$regexStr = '(^' . $thisRegex . '$)u';
$path = rawurldecode('/catalog/N%C3%BCrnberg');
$matches = array();
preg_match($regexStr, $path, $matches);

これらの2つのステップは、正規表現ルートでは提供されていないため、のようにpreg_match(...)ステアリングを取得し、のよう'/catalog/N%C3%BCrnberg'に正規表現にマッハしようとします。'/catalog/(?<city>[\\p{L}]*)/u'

解決策は、カスタム正規表現ルートを使用することです。これが例です。

于 2013-03-26T11:33:57.670 に答える