0

Perl 互換の正規表現 (PCRE)に使用できるカテゴリ プロパティ コードが多数あります (「Unicode 文字プロパティ」を参照)。

文字 ( )、数字 ( )、スペース区切り ( ) だけでなく、句読点 ( ) にも一致する正規表現パターン ( subpattern という名前)を定義しました。\p{L}\p{N}\p{Zs}\p{P}

(?<sport>[\p{L}\p{N}\p{Zs}\p{P}]*)

これを URL ルーティングに使用しているため、スラッシュは除外する必要があります。どうやってやるの?


編集:

コンテキストに関する追加情報: パターンは Zend Framework 2 モジュールのルート定義に使用されます。

/Catalog/config/module.config.php

<?php
return array(
    ...
    'router' => array(
        'routes' => array(
            ...
            'sport' => array(
                'type'  => 'MyNamespace\Mvc\Router\Http\UnicodeRegex',
                'options' => array(
                    'regex' => '/catalog/(?<city>[\p{L}\p{Zs}]*)/(?<sport>[\p{L}\p{N}\p{Zs}\p{P}]*)',
                    'defaults' => array(
                        'controller' => 'Catalog\Controller\Catalog',
                        'action'     => 'list-courses',
                    ),
                    'spec'  => '/catalog/%city%/%sport%',
                ),
                'may_terminate' => true,
                'child_routes' => array(
                    'courses' => array(
                    'type'  => 'segment',
                        'options' => array(
                            'route' => '[/page/:page]',
                            'defaults' => array(
                                'controller' => 'Catalog\Controller\Catalog',
                                'action'     => 'list-courses',
                            ),
                        ),
                        'may_terminate' => true,
                    ),
                )
            ),
        ),
    ),
    ...
);
4

2 に答える 2

3

否定先読みを使用して、文字セットから一部の文字を除外できます。あなたの例:

(?<sport>(?:(?!/)[\p{L}\p{N}\p{Zs}\p{P}])*)

基本的に、次の文字が否定先読みではないことを確認して/から (?!/)その文字が文字セットに属しているかどうかを確認し[\p{L}\p{N}\p{Zs}\p{P}]ます。

PCRE には集合集合または集合差分機能がないため、これはその回避策です。

于 2013-04-26T15:32:37.097 に答える