経路を捕捉するための正規表現変数の作成方法

誰もがこの問題で私を助けることができます。

example $uri = '/username/carlos'; => $routes[] = '/username/@name';

@nameは変数$ nameのキャプチャ文字列 "carlos"

$routes[] = '/list/edit/@id:[0-9]{3}';

$routes[] = '/username/@name';

$routes[] = '/archive/*';

$routes[] = '/';


$uri = '/username/carlos';

foreach ( $routes as $pattern )
{
    if ( preg_match( '#^' . preg_replace( '#(?:{{)[email protected](\w+\b)(?:}})?#i', '(?P<\1>[\w\-\.!~\*\'"(),\s]+)',
                            str_replace( '\*', '(.*)', preg_quote( $pattern, '/' ) ) ) . '\/?$#i', $uri, $matchs ) )
    {

        //how to make regex for this to work :


        echo $name;//carlos =>$uri = '/username/carlos'; or matt => $uri = '/username/matt';

    }
}

読んでくれてありがとう

1
なぜレディメイドルーティングフレームワークを使用しないのですか?そして、最初にそれをデバッグするためにネストされたパターン変換部分を分割するべきではありませんか?
追加された 著者 mario,

1 答え

これを有効にするためには、主にルートを正規表現に変換して、指定されたURIで使用できるようにするために、もっと多くの作業が必要です。私がそれをする方法は次の通りです

$routes = $params = array();

$routes[] = '/list/edit/@id:[0-9]{3}';
$routes[] = '/username/@name';
$routes[] = '/archive/*';
$routes[] = '/';

$uri = '/username/carlos';

foreach($routes as $pattern) {
   //Convert all characters into safe characters
    $pattern = preg_quote($pattern, '~');

   //Convert * into .*?
    $pattern = preg_replace('/(?'.print_r($pattern, true).'
'; //Convert any @name:expression into their expressions for capture $pattern = preg_replace_callback('%@([a-zA-Z]+)(\\\\:([^/]+))?%', 'regex_callback', $pattern); $pattern = '~^' . $pattern . '$~'; if(preg_match($pattern, $uri, $matches)) { $params = $matches; break; } } echo '
'.print_r($params, true).'
'; function regex_callback($data) { #echo '
'.print_r($data, true).'
'; $pattern = '[^/]+'; if(!empty($data[3])) { $pattern = stripslashes($data[3]); } return '(?P<' . $data[1] . '>' . $pattern . ')'; }

It converts the * into .*?, and then converts the @param into (?P[^/]+), or substituting [^/]+ for the expression after the :

一致するものが見つかると、それを $ params に設定し、foreachループを終了します。名前を見つけるためには、

echo $param['name'];
1
追加された
代わりにbasenameを使って検索することができます。 php.net/basename
追加された 著者 Jay Gilford,
こんにちは、$ uri = '/list/edit/123.html'の正規表現方法; $ routes [] = '/list/edit/@id:[0-9]{3}.html';結果は "123.html"ですが、仕事は一度もありません "123"申し訳ありません私の英語です!
追加された 著者 zetanova,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com