2

正規表現のヘルプを探しています。

私はこのコードを持っています:

$router->add( 
    '/activate/{token:[a-zA-Z0-9]+}', 
    array (
        'module' => 'frontend',
        'controller' => 'user',
        'action'     => 'activate'
    )
);

これは問題なく動作します。ただし、以下のものはそうではありません:

$router->add( 
    '/activate/{token:[a-zA-Z0-9]{32}}', 
    array (
        'module' => 'frontend',
        'controller' => 'user',
        'action'     => 'activate'
    )
);

私がCで持っているマッチングメカニズムは(preg_match_allでも動作します)

'#{([a-zA-Z][a-zA-Z0-9\_\-]*)(:([^}]+))*}#'

2番目の例を機能させる方法について、いくつかの指針をいただければ幸いです。

編集

preg_match_all(
    '#{([a-zA-Z][a-zA-Z0-9\_\-]*)(:([^}]+))*}#',
    '/manual/{language:[a-z]{2}}/{file:[a-z]+}.html',
    $matches,
    PREG_SET_ORDER
);

次のようなものを返したい:

Array
(
    [0] => Array
        (
            [0] => {language:[a-z]{2}}
            [1] => language
            [2] => :[a-z]{2}
            [3] => [a-z]{2}
        )
    [1] => Array
        (
            [0] => {file:[a-z]+}
            [1] => file
            [2] => :[a-z]+
            [3] => [a-z]+
        )
)
4

1 に答える 1

2

この正規表現: '#{([a-zA-Z0-9_-] )(:(. )}?)}#' は両方で機能します。

<?php

preg_match_all(
    '#{([a-zA-Z0-9\_\-]*)(:([^}]+}?))*}#',
    '/activate/{token:[a-zA-Z0-9]{32}}',
    $matches,
    PREG_SET_ORDER
);
print_r($matches);

preg_match_all(
    '#{([a-zA-Z0-9\_\-]*)(:([^}]+}?))*}#',
    '/activate/{token:[a-zA-Z0-9]+}',
    $matches,
    PREG_SET_ORDER
);
print_r($matches);
于 2012-11-07T20:05:01.940 に答える