繁体   English   中英

PHP preg_replace错误

[英]PHP preg_replace error

我有以下代码:

protected function safePath($path) {
        $path = (string) $path;

        $path = preg_replace(
            array(
            '#[\n\r\t\0]*#im',
            '#/(\.){1,}/#i',
            '#(\.){2,}#i',
            '#(\.){2,}#i',
            '#\('.DIRECTORY_SEPARATOR.'){2,}#i'
            ),
            array(
            '',
            '',
            '',
            '/'
            ),
            $path
            )
        ;
        return rtrim($path,DIRECTORY_SEPARATOR);
    }

使用路径执行函数后,出现以下错误:

警告 :preg_replace()[function.preg-replace]:编译失败: 534行上...... / myfile.php中偏移量3处的括号不匹配

这是第534行,在此处标记为:

protected function safePath($path) {
        $path = (string) $path;

        $path = preg_replace(
            array(
            '#[\n\r\t\0]*#im',
            '#/(\.){1,}/#i',
            '#(\.){2,}#i',
            '#(\.){2,}#i',
            '#\('.DIRECTORY_SEPARATOR.'){2,}#i'
            ),
            array(
            '',
            '',
            '',
            '/'
            ),   <---------------- THis is line 534
            $path
            )
        ;
        return rtrim($path,DIRECTORY_SEPARATOR);
    }

对解决此错误有帮助吗? 谢谢。

在最后一个正则表达式中,您逃脱了左括号,但没有逃脱右括号

'#\('.DIRECTORY_SEPARATOR.'){2,}#i'

应该是...

'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'
                           ^
                           |
                       missing slash

...或者斜线根本不应该存在。 无论哪种方式,其都不一致。

因为这里有这部分:

    '#\('.DIRECTORY_SEPARATOR.'){2,}#i'

我猜你在Linux系统上。 在Windows上,DIRECTORY_SEPARATOR是反斜线,与该行上的初始反斜线匹配。

在linux上,DIRECTORY_SEPARATOR是一个正斜杠,因此此字符串的开头有一个转义的左括号,而结尾没有匹配的括号。

您可以通过用/\\替换该行上的DIRECTORY_SEPARATOR来在两种类型的OS上重现该错误。 您会立即看到结果。

奇怪的是,只有两个假肢都逃脱了,我才能得到该错误:

'#\('.DIRECTORY_SEPARATOR.'\){2,}#i'

也许是因为您没有逃避DIRECTORY_SEPARATOR?

'#\(\\'.DIRECTORY_SEPARATOR.'\){2,}#i'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM