2011-10-22 4 views
0

私はcodeigniterを何時間も掘り下げてきました。私はルータクラスでいくつかの異なる正規表現を見つけました。Regexの特殊文字の意味

preg_match('#^'.$key.'$#', $uri); 
preg_replace('#^'.$key.'$#', $val, $uri); 

私は以下のように、テストのphpファイルを作っ:

<?php 

$route['login'] = 'user/login'; 
$route['user/([a-zA-Z-]+)'] = 'user/profile/$1'; 

$uri = 'user/asfd'; 

foreach ($route as $key => $val) 
{ 
    if (preg_match('#^'.$key.'$#', $uri)) 
    { 
     echo preg_replace('#^'.$key.'$#', $val, $uri); 
    } 
} 

それは正しく

user/profile/asfd 

何私はここで取得しないこと#^と$#の使用であるを提供します。私はいくつかの説明を見つけるためにウェブをクロールしましたが、運はありません。

答えて

5

この例では、最初と最後の#が正規表現の区切り文字です。あなたはおそらく以前は/と見てきましたが、多くの異なる文字を使用できます。正規表現パターンの始めと終わりを意味するだけで、大文字小文字の区別(i)、グローバルマッチング(g)などの正規表現のオプションが追加されます(gの代わりにpreg_match_all()が使用されます)

実際に一致するパターンは^$key$です。つまり、一致する文字列の先頭、値$key、および文字列の最後です。

この式で区切り文字として#の代わり/を選択する可能性が高い理由は、それが\とURIパターンのスラッシュをエスケープする必要がなくなりますということです。

2

PHPマニュアルで説明されているように、それらはregex delimitersです。 preg_ *関数はPCRE(Perl Compatible Regular Expression)ライブラリから来ます。 Perlは、文字列が一重引用符や二重引用符を使用する方法とは異なり、正規表現デリミタを使用してリテラル正規表現をサポートしています。 PHPはリテラル正規表現をサポートしていませんが、ライブラリには区切り文字が必要です。