我一直在挖掘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
我没有得到的是#^和$#的用法。我已经爬网了,找到了一些解释,但没有运气。
答案 0 :(得分:5)
在这个例子中,开头和结尾#
是正则表达式的分隔符。您之前可能已将它们视为/
,但可以使用许多不同的字符。它们仅表示正则表达式模式的开始和结束,并且可能后跟其他正则表达式选项,如不区分大小写(i
),全局匹配(g
)等(尽管{{1}用来代替PHP中的preg_match_all()
标志)
因此,匹配的实际模式是g
。也就是说,要匹配的字符串的开头,^$key$
的值以及字符串的结尾。
在此表达式中选择$key
而不是#
作为分隔符的可能原因是它消除了使用/
转义URI模式斜杠的需要。
答案 1 :(得分:2)
他们是regex delimiters,如PHP手册中所述。 preg_ *函数来自PCRE(Perl兼容正则表达式)库。 Perl支持文字正则表达式,使用正则表达式分隔符,而不像字符串如何使用单引号和双引号。 PHP不支持文字正则表达式,但库仍然需要分隔符。