2012-02-17 223 views
25

我想檢測一個字符串是否包含數字和字母。檢查一個字符串是否包含數字和字母

例如:

  • 鑑於PncC1KECj4pPVW,就因爲它包含兩個被寫入一個文本文件中。
  • 鑑於qdEQ,它不會,因爲它只包含字母。

有沒有辦法做到這一點?

我試圖用

$string = PREG_REPLACE("/[^0-9a-zA-Z]/i", '', $buffer); 

但沒有奏效。

任何幫助,將不勝感激。

+3

[A-ZA-Z]與A/I改性劑是一種同義反復 – 2012-02-17 21:53:51

+0

@MarkBaker的,因爲當你想使_sure_它的東西是不區分大小寫:) – 2012-02-17 22:00:33

+2

被允許在字符串中的非字母數字字符? – 2012-02-17 22:26:47

回答

17
if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString)) 
{ 
    echo 'Secure enough'; 
} 

回答更新基於https://stackoverflow.com/a/9336130/315550,日Thnx到https://stackoverflow.com/users/116286/jb

+22

@Duncan,這隻有在字母出現在數字前纔有效。不適用於'9877abc'。 – 2012-02-17 21:58:44

+0

非常感謝這些作品,我明白它的工作原理。 – 2012-02-17 21:59:22

+4

這對於'a2'或'A2'也不適用# – 2012-02-17 22:02:37

6

這工作乾淨利落:

$myString="abc123"; 
if(preg_match('([a-zA-Z].*[0-9]|[0-9].*[a-zA-Z])', $myString)) 
{ 
    echo('Has numbers and letters.'); 
} else { 
    echo("no"); 
} 

要看到它的行動,將它複製並粘貼到此處:http://phptester.net/index.php?lang=en

+0

這適用於字母,然後數字,或數字,然後字母。但是,它允許其他角色(因爲你沒有說在帖子中排除他們)。 – 2012-02-17 22:05:33

+0

已更新爲非字母數字。 – 2012-02-17 22:30:28

+0

您的非字母數字版本讓我想要。如果我想要中間的號碼怎麼辦? – 2012-02-17 22:34:43

0

如果你想匹配只有字母數字字符(也就是說,把字符串視爲只要還有其他內容,就像空格或特殊字符一樣無效),這應該起作用。

否則,只要刪除第一個preg_match()

function myTest($string) 
{ 
    echo "test '".$string."': " 
    . intval(preg_match('/^[a-z\d]+$/i', $string) // has only chars & digits 
     && preg_match('/[a-z]/i', $string)  // has at least one char 
     && preg_match('/\d/', $string))   // has at least one digit 
    . "\n"; 
} 

myTest('aAa'); // => 0 
myTest('111'); // => 0 
myTest('aAa111bbb'); // => 1 
myTest('111aAabbb'); // => 1 
myTest('aAabbb111'); // => 1 
myTest('111bBb222'); // => 1 
myTest('111 bBb 222'); // => 0 
myTest('$$$$'); // => 0 
40

看來最簡單的方法就是在兩個正則表達式中完成它。

if (preg_match('/[A-Za-z]/', $myString) && preg_match('/[0-9]/', $myString)) 
{ 
    echo 'Contains at least one letter and one number'; 
} 

我想另一種方法做到這一點如下。它說「一封信,然後在某個時間點上一個數字(反之亦然)」。但上面的一個更容易閱讀IMO。

if (preg_match('/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/', $myString)) 
{ 
    echo 'Contains at least one letter and one number'; 
} 
+0

@Downvoter,你能解釋一下嗎? – 2012-02-17 22:14:03

+0

我沒有downvoted,但你的第一個和第二個解決方案將匹配「000 aaaa 111」,我認爲這應該被認爲是無效的(只有「000aaaa111」等,該字符串不應該包含除字母數字之外的其他字符) - 然而OP沒有具體說明「000 aaaa 111」應該被認爲是無效的,但是給出的例子表明了這種行爲。 – 2012-02-17 22:22:56

+0

@FrostyZ你很對,但問題並不是說它不應該包含其他字符。我以書面形式回答了這個問題。 – 2012-02-17 22:26:08

7

我唯一的問題是是否必須是一個正則表達式。我會選擇兩三個(因爲你必須建立一個複雜的正則表達式來一次完成。

比方說,你需要有:

  • 至少一個大寫字符[A-Z]
  • 至少一個小寫字符[a-z]
  • 至少一個數字\d
  • 至少有密碼7個字符長

該easies T和最有效的解決方案:

if(preg_match('~[A-Z]~', $password) && 
    preg_match('~[a-z]~', $password) && 
    preg_match('~\d~', $password) && 
    (strlen($password) > 6)){ 
    echo "Good password"; 
} else { 
    echo "Not so much"; 
} 

否則,在一個正則表達式,你將不得不考慮幾種選擇:

  • [a-z][A-Z]+\d
  • [a-z]\d+[A-Z]
  • [A-Z][a-z]+\d
  • [A-Z]\d+[a-z]
  • \d[a-z]+[A-Z]
  • \d[A-Z]+[a-z]

加入它變成像一個大的,幾乎沒有可讀的「或運算」正則表達式:

~([a-z][A-Z]+\d|[a-z]\d+[A-Z]|[A-Z][a-z]+\d|[A-Z]\d+[a-z]|\d[a-z]+[A-Z]|\d[A-Z]+[a-z])~ 

當然你可以去(需要只是檢查大寫和小寫時)作者:

preg_match('~([a-z][A-Z]|[a-z][A-Z])~'); 

而且還必須手動檢查長度。第二種解決方案看起來相當無效,難以閱讀。我的建議:與第一個一起去。

0

檢查字符串是否包含數字或不!

function ContainsNumbers($String){ 
    return preg_match('/\\d/', $String) > 0; 
} 
0

如果你需要支持多國語言,從PHP 5.1其它轉義序列的字符類型listed here增加。

以下功能利用這一優勢,並允許您在多個字母檢查字母和數字:

檢查任何字母串存在:

function has_letter($x){ 
    if (preg_match("/[\p{L}]/u",$x)) { 
      return true; 
    } 
    return false; 
} 

檢查字符串包含任何數量的

function has_number($x) { 
    if (preg_match("/[\p{N}]/u",$x)) { 
     return true; 
    } 
    return false; 
} 

用法

$string = '123اختبا'; 
has_letter($string); // true 


$string = '೪౨౨'; 
has_number($string); // true 

一起都按照要求

$string='I am 28'; 
if (has_letter($string)&&has_number($string)){ 
    // true 
} 

$string='I am ౨೩೫'; 
if (has_letter($string)&&has_number($string)){ 
    // true 
} 

$string='Привет, друг, как ты?'; 
has_number($string); // false - this Russian text doesn't contain a number 
-2

嘿這裏有以下一些原則:

問題:在字符串 對於例如裏面的數字沒有驗證

OM 4 OM, OM4OM , space OM 4 OM space, space OM4OM space. -----> No valdation over this?? 

解決方案:

if (preg_match("/[A-Za-z].*[0-9]/",$_POST["name"])) 
    { 
    header("location:http://localhost/Test1.html"); 
    exit; 
    } 
Logic: /[A-Za-z].*[0-9]/ 

它說前幾個字符,然後在一些點數。

4

PHP有一個內置函數。它叫做ctype_alnum

if(!ctype_alnum($string)) { 
    return $error; 
} 
// Continue on your way... 
+1

這是一個很棒的功能。但是,它不回答OP,因爲它只檢查字符串是否包含字母或數字。它不驗證該字符串是否包含兩者。 – butlerblog 2017-10-09 14:11:55