web-dev-qa-db-ja.com

PHPに文字列が少なくとも1つの文字、数字、特殊文字があるかどうかを確認する方法

現在、各文字列の内容をチェックする小さなスクリプトを書いています。

文字列に文字(大文字または小文字)、数字、および特殊文字が含まれていることを確認するために、REGEXはどうなるのだろうと思いましたか。

これは私がこれまでに知っていることです(多くはありません):

if(preg_match('/^[a-zA-Z0-9]+$/i', $string)):

助けてください!

ありがとうございました!

15
Peter Stuart

最も簡単な(そしておそらく最良の)方法は、preg_matchを使用して3つの個別のチェックを行うことです。

$containsLetter  = preg_match('/[a-zA-Z]/',    $string);
$containsDigit   = preg_match('/\d/',          $string);
$containsSpecial = preg_match('/[^a-zA-Z\d]/', $string);

// $containsAll = $containsLetter && $containsDigit && $containsSpecial
48
Ry-

正の lookahead を使用して、単一の正規表現を作成できます。

$strongPassword = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/');
//                                              special characters  ^^^^
11
Igor Korkhov

特定の文字列に次の各カテゴリの少なくとも1つの文字が含まれていることを確認するための説明で、ここで素晴らしい答えを見つけました。

小文字、大文字、数字、記号

^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$

簡単な説明:

^ //文字列の始まり

(?=.*[a-z]) //肯定的な先読みを使用して、少なくとも1つの小文字が存在するかどうかを確認します

(?=.*[A-Z]) //ポジティブルックアヘッドを使用して、少なくとも1つの大文字が存在するかどうかを確認します

(?=.*\d) //先読みを使用して、少なくとも1つの数字が存在するかどうかを確認します

(?=.*[_\W]) //肯定的な先読みを使用して、少なくとも1つのアンダースコアまたは非Word文字が存在するかどうかを確認します

.+ //文字列全体をぐちゃぐちゃにする

$ //文字列の終わり

お役に立てば幸いです。

9
Emad Samir Zaki

これを行うには、3つの異なる正規表現を使用するのが最適な場合があります。これは、文字列内の特殊文字の場所に応じて、6つの異なる可能性に一致させる必要があるためです。しかし、1つの正規表現でそれを実行したい場合で、特殊文字が[+?@]である場合、それは可能です。

$string = "abc@123";
$regex = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/"
if (preg_match($regex, $string)) {
   // special characters
}
4
arc

文字は\pL、数字は\pNと特殊文字は[what you want]、ここではそれが文字でも数字でもないと想定しているため、正規表現は次のようになります。

/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/
3
Toto

False(上記の選択された答え-ありがとう!)は、頭を包み込む(正規表現に慣れていない場合)かなり簡単な方法で、うまくいく方法を考え出しました。

私はこれを少し詳しく説明するために入れました:

(あなたはそれを http://phptester.net/index.php?lang=en に貼り付けることができます)

<?php

$pass="abc1A";

$ucl = preg_match('/[A-Z]/', $pass); // Uppercase Letter
$lcl = preg_match('/[a-z]/', $pass); // Lowercase Letter
$Dig = preg_match('/\d/', $pass); // Numeral
$nos = preg_match('/\W/', $pass); // Non-alpha/num characters (allows underscore)

if($ucl) {
    echo "Contains upper case!<br>";
}

if($lcl) {
    echo "Contains lower case!<br>";
}

if($Dig) {
    echo "Contains a numeral!<br>";
}

// I negated this if you want to dis-allow non-alphas/num:
if(!$nos) {
    echo "Contains no Symbols!<br>"; 
}

if ($ucl && $lcl && $Dig && !$nos) { // Negated on $nos here as well
    echo "<br>All Four Pass!!!";
} else {
    echo "<br>Failure...";
}

?>
2
Scott Hallett