2011-01-28 113 views
1

我想在php中編寫一個正則表達式來檢查以確保傳遞的字符串是三件事情之一,但是我很難(我真的與正則表達式鬥爭)。正則表達式幫助

我需要確保我收到的參數包含的這三樣東西之一,而不是其他:

  1. 「|」這就是它只是一個單一的管道或
  2. 「」這就是它只是一個空字符串或
  3. 「| 1 | 534 | 3453 | 23 | 213 | 2 |」使用管道作爲分隔符爲一系列數字

謝謝你的幫助的長字符串(這是不斷地給我出了問題,覺得我需要在正則表達式專門買了一本書)

+1

我可以建議[掌握正則表達式](http://oreilly.com/catalog/9780596528126)(也就是貓頭鷹書) – 2011-01-28 19:18:19

+1

有兩件事可以幫助你閱讀正則表達式。本教程:http://www.regular-expressions.info/tutorial.html和這個動作網站來嘗試你的正則表達式:http://gskinner.com/RegExr/ – 2011-01-28 19:27:50

回答

2
preg_match('/^(?:\|(?:\d+\|)*)?$/', $input); 
+0

字符的性格,與我的答案完全一樣。太慢了。 – sdleihssirhc 2011-01-28 19:20:01

1

要做到這一點是將其分割成三個獨立的檢查,最簡單的方法:

  1. 的字符串就是一個單管(strcmp($str,"|") == 0
  2. 字符串爲空(strlen($str) == 0)。
  3. 的字符串匹配的正則表達式/^[0-9\|]+$/

不要使它比更難它需要通過嘗試所有這些支票塞進一個正則表達式。你的代碼會更容易被理解,你的代碼的未來維護者會感謝你。

編輯:只是爲了顯示我在說一下,這裏的一些示例代碼:

if(strcmp($str,"|") == 0 || 
    strlen($str) == 0  || 
    preg_match('^[0-9\|]+$', $str) { 
    ... 
} 

VS

if(preg_match('/^(?:\|(?:\d+\|)*)?$/', $str) { 
    ... 
} 

一目瞭然,其中一個執行...如果$str是空?

0

(^(\ |)([0-9 \ |] {0,})(\ |)$)|(^(\ |)$)|()

使用上述正則表達式,並且如果沒有mathches你的字符串是無效的,othervise其有效,並嘗試檢查空str_len($ string)> 0然後檢查正則表達式