2013-03-23 175 views
-1

當我提交這個表單時,我不斷收到一個不應該做的匹配。我知道這與美元符號有關,但我無法解決這個問題,我似乎無法在Google上找到正確的答案。

<?php 
if (isset($_POST['test'])) { 
    $u = $_POST['test']; 
    echo preg_match('/[a-z0-9\-]+/i', $u); 
} 
?> 

<form method="post"> 
    <input type="text" name="test" value="12$abc213"> 
    <button type="submit">Submit</button> 
</form> 
+1

你忘了提及它應該和不應該匹配以及輸入字符串是什麼。 – PeeHaa 2013-03-23 19:01:18

+0

你可以在表單字段值中看到$符號嗎? preg_match不符合美元符號,所以它不應該通過。對不起,認爲這很明顯。 – Christian 2013-03-23 19:02:55

+1

這應該是兩個匹配'12'和'abc213'。問題是什麼? – PeeHaa 2013-03-23 19:03:48

回答

2

您必須在字符串的開頭和結尾匹配,否則會與匹配的子通:

preg_match('/^[a-z0-9\-]+$/i', $u); 
+3

+1,因爲你實際上給出了一個解釋,而不是隻發佈一行代碼。 = o) – 2013-03-23 19:05:58

+0

系統說我不能接受7分鐘......但是謝謝:) – Christian 2013-03-23 19:07:56

3

應該

preg_match('/^[a-z0-9\-]+$/i', $u) 
+0

+1 9秒更快;) – Tchoupi 2013-03-23 19:04:49

+0

熱愛競爭。多謝你們! – Christian 2013-03-23 19:07:36

2

您的preg_match是找到匹配,因爲「1 '是匹配,'2'是amatch,'abc213'是匹配,'a'是匹配等。你想確保整個字符串匹配嗎?然後嘗試此模式:

preg_match("/^[a-z0-9\-]+$/i", $u); 

將表達式包裝在^ ..中將意味着它必須以該序列開始和結束。除非字符串中的所有字符都與此模式匹配,否則這將不匹配,如果字符串中的任何「字符序列」與模式匹配,那麼您的字符匹配。

+0

其實如果你想做'preg_match_all',你會發現實際上只有2個匹配。 – PeeHaa 2013-03-23 19:09:14

+0

@PeeHaa,那是因爲貪婪vs不真實。實際上,PHP會很貪婪,所以它會匹配一個序列,直到發現一個不符合該序列的字符。所以不是立即匹配'1'然後匹配'2'然後匹配'12',貪婪的REGEX'er只匹配'12'。在大多數情況下,當涉及正則表達式時,貪婪比非貪婪更有用。我希望我對'1'的解釋與這種模式的匹配不會混淆任何人......:S – 2013-03-23 19:12:26