PHP preg_match 未知修饰符错误

问题描述 投票:0回答:2

消息: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 regex codeigniter escaping
2个回答
1
投票

您的正则表达式有问题,PHP 认为您尝试应用无效的“p”修饰符。

如果你这样做,你可能会知道你的正则表达式出了什么问题:

echo '#^'.$key.'$#';

您尝试对路由器进行编程的事实表明 $key 最有可能包含“#p”(在 URL 中常见)。

解决方案:在您的情况下,您可以用反斜杠转义字符“#”。引用自 php 文档: “如果分隔符需要在模式内匹配,则必须使用反斜杠进行转义。”


0
投票

如果我正确理解你的问题,请用 preg_quote() 包围 $key,如下所示:

if (preg_match('#^'.preg_quote($key).'$#', $uri, $matches))

此函数将自动转义 $key 中的所有正则表达式命令。

© www.soinside.com 2019 - 2024. All rights reserved.