正则表达式中特殊字符的含义

时间:2011-10-22 02:09:29

标签: php regex preg-match

我一直在挖掘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

我没有得到的是#^和$#的用法。我已经爬网了,找到了一些解释,但没有运气。

2 个答案:

答案 0 :(得分:5)

在这个例子中,开头和结尾#是正则表达式的分隔符。您之前可能已将它们视为/,但可以使用许多不同的字符。它们仅表示正则表达式模式的开始和结束,并且可能后跟其他正则表达式选项,如不区分大小写(i),全局匹配(g)等(尽管{{1}用来代替PHP中的preg_match_all()标志)

因此,匹配的实际模式是g。也就是说,要匹配的字符串的开头,^$key$的值以及字符串的结尾。

在此表达式中选择$key而不是#作为分隔符的可能原因是它消除了使用/转义URI模式斜杠的需要。

答案 1 :(得分:2)

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