2012-06-01 27 views
2
$pattern="/[a-z]*[a-z]*/i"; 
if(!preg_match($pattern, $value)){ 
     $this->error_name="The name should contain at least two letters."; 
     } 

我試圖檢查用戶是否至少輸入了兩個字母的名字。所以基本上,他不能輸入他的名字111111111111 ..它必須有兩個字母。正則表達式,使用php

我寫的正則表達式不起作用。爲什麼?

+2

因爲'*'的意思是「零個或多個」。 '111111'有零個字母,所以它匹配。 http://www.regular-expressions.info/repeat.html –

回答

0
$pattern="/[a-z].*[a-z]/i"; 
if(!preg_match($pattern, $value)){ 
    $this->error_name="The name should contain at least two letters."; 
} 

您的代碼並沒有因爲*工作意味着零次或多次,所以它也會匹配一個或一個字符。

+0

如果您只想測試字符串是否包含兩個字母,則不需要'。*'。 –

+0

它只能這樣工作:aa1111111111 ..但是如果用戶名是a1111111111a ..它也是有效的 –

+0

通過在兩者之間添加'。*'來修正。 – Jeroen

1

試一下這個(你的代碼修改):

$pattern="/^[a-z]{2}.*/i"; 
if(!preg_match($pattern, $value)){ 
     $this->error_name="The name should contain at least two letters."; 
     } 
+0

它可以用於這樣的事情a11111111111a –

3

您可以使用:

$pattern="/^[a-z]{2,}$/i"; 

這將確保該名稱具有唯一的字母和至少有2個字母的名稱。

編輯:

看起來你想要的名稱包含至少兩個字母,可以包含其他非字母以及:

$pattern="/^.*[a-z].*[a-z].*$/i"; 
+0

但它也可以包含「'alpha」以外的字符。 – Cylian

+0

但我認爲這意味着,至少有兩個字母開始接近另一個...此用戶名也是有效的a111111111b –

0
$pattern="/^([a-z]{2})|([a-z].*[0-9].*[a-z].*).*/i"; 

我想答案應該是一個上面..你的答案給了我一個線索..

現在它也將匹配這些名字:

a1111111111111a

1

返回true時在字符串中至少使用兩個字母:

preg_match_all('/[a-z]/', $str, $m) >= 2; 
+0

+1,好戲! – Cylian