消息:preg_match():未知修饰符“p”
文件名:core/Router.php
线路号码:399
回溯:
文件:/home/spdcin/public_html/demo/no-waste/index.php 线路:292 函数:require_once 我在第 2 行收到此错误
$key = str_replace(array(':any', ':num'), array('[^/]+', '[0-9]+'), $key);
// Does the RegEx match?
//line no 2
if (preg_match('#^'.$key.'$#', $uri, $matches))
{
// Are we using callbacks to process back-references?
if ( ! is_string($val) && is_callable($val))
{
// Remove the original string from the matches array.
array_shift($matches);
// Execute the callback using the values in matches as its parameters.
$val = call_user_func_array($val, $matches);
}
// Are we using the default routing method for back-references?
elseif (strpos($val, '$') !== FALSE && strpos($key, '(') !== FALSE)
{
$val = preg_replace('#^'.$key.'$#', $val, $uri);
}
$this->_set_request(explode('/', $val));
return;
}
}
您的正则表达式有问题,PHP 认为您尝试应用无效的“p”修饰符。
如果你这样做,你可能会知道你的正则表达式出了什么问题:
echo '#^'.$key.'$#';
您尝试对路由器进行编程的事实表明 $key 最有可能包含“#p”(在 URL 中常见)。
解决方案:在您的情况下,您可以用反斜杠转义字符“#”。引用自 php 文档: “如果分隔符需要在模式内匹配,则必须使用反斜杠进行转义。”
如果我正确理解你的问题,请用 preg_quote() 包围 $key,如下所示:
if (preg_match('#^'.preg_quote($key).'$#', $uri, $matches))
此函数将自动转义 $key 中的所有正则表达式命令。