2009-10-27 42 views
0

我有以下代码: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替换]:编译失败:在不匹配的括号中偏移3 ....../myfile.php上线

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

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

在最后的正则表达式

回答

1

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

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

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

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

只需将该行的DIRECTORY_SEPARATOR替换为/\即可在任一类OS上重现错误。你会马上看到结果。

+0

嗯......那也是我的回答,尽管这里的措辞比较好。 – SeanJA 2009-10-27 22:27:25

2

,你躲过了左括号,但不是关闭一个

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

也许应该...

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

...或者是斜线不该”不要在那里。无论哪种方式,它的不一致。

0

强大奇怪,如果两个parethesees转义,我只能得到这个错误:

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

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

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