2011-10-22 46 views
0

我一直在挖掘codeigniter几个小时。我在路由器类中发现了一些不同的正则表达式。正则表达式中特殊字符的含义

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)等(尽管preg_match_all()用于代替PHP中的g标志)

因此,匹配的实际模式是^$key$。即,要匹配的字符串的开头,值$key和字符串的结尾。

可能的原因在这个表达式选择#代替/作为分隔符的是,它不需要用\逃脱URI模式的斜线。

2

它们是regex delimiters,如PHP手册中所述。 preg_ *函数来自PCRE(Perl Compatible Regular Expression)库。 Perl支持文字正则表达式,使用正则表达式分隔符而非字符串如何使用单引号和双引号。 PHP不支持文字正则表达式,但该库仍然需要分隔符。