2009-10-27 74 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'