2013-06-30 38 views
1

正則表達式PHP代碼

// If url matches regex 
      $regex = "/^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$/"; 
     if (preg_match($regex, $this->value)) { 

      $this->valid(); 
     } 

錯誤消息

Warning: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Unknown modifier 'p' in C:\Apache\www\profiletwist\lib\php\form\url.php on line 41 
Call Stack 
# Time Memory Function Location 
1 0.0079 440016 {main}() ..\new.php:0 
2 0.0964 667832 form->validate() ..\new.php:60 
3 0.0968 668248 form_URL->validateUploadURL() ..\form.php:372 
4 0.0969 668400 preg_match () ..\url.php:41 
Variables in local scope (#3) 

$regex = 



string '/^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$/' (length=79) 

問題

如何解決這個 「未知的修飾詞」 錯誤的正則表達式不會出現?PHP正則表達式 「未知改性劑P」

最後,我想正則表達式,使得確保文本輸入相匹配:

"/upload/temporary/####_##_##_[A-z0-9 _-]+ "." [a-z]{3} 

這是一個文件名的目標。開始不會改變,最後一部分可以是一個隨機哈希,隨後是任意擴展。進一步的處理是在正則表達式之後完成的,但這是第一個測試。

謝謝!

+0

而且有可能[+100重複](http://stackoverflow.com/search?page=3&tab=newest&q=%5bphp%5d%20%5bregex %5D%圖20是%3aquestion%20closed%3ano%20unknown%20modifier)。基本上你可以使用其他分隔符或(最佳實踐)使用[**'preg_quote()'**](http://php.net/preg-quote)。 – HamZa

+0

@HamZa當你真正想寫一個正則表達式(而不僅僅是匹配一大堆字面文本)時,最佳實踐如何?我認爲選擇其他分隔符是最佳實踐。 –

+1

@ProfileTwist,因爲沒有人將它包含在他們的答案中,所以這裏是官方的[PHP中分隔符的參考](http://www.php.net/manual/en/regexp.reference.delimiters.php)。 –

回答

5

在你逃避你的分隔符正則表達式的字符串的這個錯誤。或者更好的使用不中的正則表達式本身顯示爲分隔符字符:

其他分隔符(推薦

$regex = "#^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$#"; 

逃脫分隔符

$regex = "/^(\/upload\/temporary\/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ \/-]+.[A-z]{2,4}$/"; 
+0

謝謝你的可怕解釋。 – ProfileTwist

3
$regex = "~^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[\w./-]+\.[a-z]{2,4}$~"; 

更改您的分隔符~

當您使用例如/一個分隔符,你必須逃避你的模式所有litteral / otherwhise正則表達式引擎認爲它是模式的結束。

由於u是改性劑和p不是一個修改器,你有因爲子/^(/up....

3

您需要跳過正斜線或者只是使用另一個分隔符(我用!在這種情況下):

$regex = "!^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$!"