PHP preg_replace错误

时间:2009-10-27 16:58:11

标签: php preg-replace

我有以下代码:

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]:编译失败: ...... / myfile.php 中偏移3处的不匹配括号 534

其中第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);
    }

修复此错误的任何帮助?谢谢。

3 个答案:

答案 0 :(得分:2)

在最终的正则表达式中,你已经逃过了左括号,但没有结束那个

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

也许应该......

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

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

答案 1 :(得分:1)

这是因为这部分就在这里:

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

我猜你是在Linux系统上。在Windows上,DIRECTORY_SEPARATOR是一个反斜杠,它与你在该行上的初始反斜杠相匹配。

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

您只需使用/\替换该行上的DIRECTORY_SEPARATOR,即可在任何类型的操作系统上重现错误。你会马上看到结果。

答案 2 :(得分:0)

强大奇怪,如果两个parethesees被逃脱,我只能得到错误:

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

也许是因为你没有逃离DIRECTORY_SEPARATOR?

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