2011-06-17 12 views
1

:私が欲しいもの正規表現と末尾のスラッシュ

/test\/([A-Za-z]+)\/([A-Za-z]+)\/?([A-Za-z]+)?\/?/ 

=> 

test/\1_\2/\3/ 

がありwheterそれが唯一のhttp://domain.com/testが言うならば、それは問題ではないということであり、後続のスラッシュかどうか - どうすればいいですか?

EDIT:

私はこれをやっている:

を、私はこの配列を持っている:私は何

$routing = array(
    '/test\/([A-Za-z]+)\/([A-Za-z]+)\/?([A-Za-z]+)?\/?/' => 'test/\1_\2/\3/', 

    '/error\/([0-9]+)/' => 'error/error_\1', 
    '/sitemap\.html/' => 'sitemap', 
    '/search\/([^\/]+)?/' => 'search/view/$1', 
); 

は私がルートにURLをこのアクションを実行することを、次のとおりです。

global $routing; 

foreach ($routing as $pattern => $result) { 
    if (preg_match($pattern, $url)) { 
     return preg_replace($pattern, $result, $url); 
    } 
} 

return ($url); 

私のフレームワークはルーティングでこれを行います:

など。 コントローラ/ FUNC /ン/パラメータ=機能/ func_tion /パラメータ:urlは21 テスト:: stack_helloように設定(21)

に=ある が実際に テスト/スタック/ハロー/することができます。

+5

を示し

$text = 'test/abc/de/f'; $replacement = 'test/\1_/\3/\2/'; // de and f should switch places var_dump(preg_replace($regex, $replacement, $text)); 

。そうすれば、すべての '/'文字をエスケープする必要はありません。 –

+0

スラッシュで終了する必要があります。それ以外の場合は、解析エラーが発生します。 :) –

+3

それは必要ありません:http://php.net/manual/en/regexp.reference.delimiters.php – mario

答えて

0
$regex = '#test(?:/([a-z]+))(?:/([a-z]+))(?:/([a-z]+))/?$#i'; 

これは、testとそのあとに/と一連の文字が続く文字列と一致し、そのパターンが2回以上繰り返されます。一致する文字列の最後の文字はオプションです(そして、$のため文字列は終了します)。パターンは3回繰り返されます。これは、3つのすべてのマッチを置換パターンとして使用できる唯一の方法だからです。私はあなたが何か他のものに最初と最後の文字を変更示唆文字列test/abc_/f/de/

+0

そして、それは "相手側"でどのようにマッチすることができますか? 'admix/\ 1_ \ 2/\ 3 /'を再利用できますか? :-) –

+0

@Dennis:万が一置換文字列についてお話されていますか?もしそうなら、質問を更新してそれをクリアし、現在のpreg_replace呼び出しを表示してください。 – mario

+0

私はこのエラーが発生します:警告:preg_match():不明な修飾子 ')'あなたのソリューションを使用するとき。私は私の質問を更新して、問題が何であるかをもっと明示しています:) thanks –

関連する問題