2015-07-03 77 views
0

我有一個字符串,類似max_length[5]。爲了驗證,我需要能夠驗證它具有字符串結構(定義了max_length,min_length,exact_length選項),[,數字(任意數量:5,121,5322等)]。喜歡的東西:從數字中分離字符串

$string = 'max_length[5]'; 
$split = splitThis($string); //replace splitThis() with a real function 
//split looks like: array('max_length[]', 5) or something like that 

如果$split才得以問世的評論的話,我可以很容易地驗證max_length[]是一個有效的字符串,5是一個有效的數字。我將如何做到這一點?可能嗎?我現在一直在尋找類似的方案几個小時,並沒有能夠得到任何其他解決方案來解決我的問題。

this one這樣的問題是類似的,但我沒有能夠得到它在我的情況下工作。

回答

2

這並不是特別困難。唯一棘手的事情是設計模式,以提取更容易有趣的數據:

function splitThis($str) { 
    return preg_match('~\A(?:max|min|exact)_length(?=\[(\d+)]\z)~', $str, $m) ? $m : false; 
} 

print_r(splitThis("max_length[5]")); 

圖案的詳細資料:

~       # pattern delimiter 
\A       # start of the string 
(?:max|min|exact)_length 
(?=      # lookahead assertion: followed by: 
    \[(\d+)]    # digits (captured in group 1) between square brackets 
    \z      # end of the string 
) 
~ 

先行只是一個測試,以及裏面所有的子模式不是的一部分整場比賽。所以preg_match只返回「max_length」作爲整體匹配和捕獲組1,所以「5」。

用法:

if (false !== ($result = splitThis($str))) { 
    ... 
} else { 
    ... 
} 
+0

輝煌!在我能夠夢想成爲的正則表達式中,你會更好。它可能不會給出結果中的括號,但它的工作原理就是這樣。如果括號沒有正確放置,沒有給出結果,所以相同的結果只是採用不同的方法。驗證提交是否有效仍然很容易。 'array('max_length',5)'的最終結果完全符合我的需求。非常感謝!!正則表達式的解釋也很有幫助。 – justanotherprogrammer