1

我有以下代码:

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);
    }

修复此错误有什么帮助吗?谢谢你。

4

3 回答 3

2

在最后的正则表达式中,你已经逃脱了左括号,但不是右括号

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

也许应该是...

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

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

于 2009-10-27T17:02:24.280 回答
1

这是因为这里的这部分:

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

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

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

您可以在任一类型的操作系统上重现错误,只需将该行上的 DIRECTORY_SEPARATOR 替换为 a/或 a即可\。你会马上看到结果。

于 2009-10-27T17:06:28.047 回答
0

非常奇怪,如果两个 parethese 都被转义,我只能得到这个错误:

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

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

'#\(\\'.DIRECTORY_SEPARATOR.'\){2,}#i'
于 2009-10-27T17:06:00.433 回答