【问题标题】:PHP preg_replace errorPHP preg_replace 错误
【发布时间】:2010-12-10 13:47:27
【问题描述】:

我有以下代码:

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

对修复此错误有任何帮助吗?谢谢。

【问题讨论】:

    标签: php preg-replace


    【解决方案1】:

    在最后的正则表达式中,您已经转义了左括号,但没有转义结束括号

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

    应该是……

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

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

    【讨论】:

      【解决方案2】:

      因为这里有这个部分:

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

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

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

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

      【讨论】:

      • 嗯...这也是我的回答,不过这里的措辞更好。
      【解决方案3】:

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

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

      也许是因为您没有转义 DIRECTORY_SEPARATOR ?

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

      【讨论】:

        猜你喜欢
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 1970-01-01
        • 2011-01-14
        相关资源
        最近更新 更多