現在、各文字列の内容をチェックする小さなスクリプトを書いています。
文字列に文字(大文字または小文字)、数字、および特殊文字が含まれていることを確認するために、REGEXはどうなるのだろうと思いましたか。
これは私がこれまでに知っていることです(多くはありません):
if(preg_match('/^[a-zA-Z0-9]+$/i', $string)):
助けてください!
ありがとうございました!
最も簡単な(そしておそらく最良の)方法は、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
正の lookahead を使用して、単一の正規表現を作成できます。
$strongPassword = preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/');
// special characters ^^^^
特定の文字列に次の各カテゴリの少なくとも1つの文字が含まれていることを確認するための説明で、ここで素晴らしい答えを見つけました。
小文字、大文字、数字、記号
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$
簡単な説明:
^
//文字列の始まり
(?=.*[a-z])
//肯定的な先読みを使用して、少なくとも1つの小文字が存在するかどうかを確認します
(?=.*[A-Z])
//ポジティブルックアヘッドを使用して、少なくとも1つの大文字が存在するかどうかを確認します
(?=.*\d)
//先読みを使用して、少なくとも1つの数字が存在するかどうかを確認します
(?=.*[_\W])
//肯定的な先読みを使用して、少なくとも1つのアンダースコアまたは非Word文字が存在するかどうかを確認します
.+
//文字列全体をぐちゃぐちゃにする
$
//文字列の終わり
お役に立てば幸いです。
これを行うには、3つの異なる正規表現を使用するのが最適な場合があります。これは、文字列内の特殊文字の場所に応じて、6つの異なる可能性に一致させる必要があるためです。しかし、1つの正規表現でそれを実行したい場合で、特殊文字が[+?@]である場合、それは可能です。
$string = "abc@123";
$regex = "/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$%^&]).*$/"
if (preg_match($regex, $string)) {
// special characters
}
文字は\pL
、数字は\pN
と特殊文字は[what you want]
、ここではそれが文字でも数字でもないと想定しているため、正規表現は次のようになります。
/^(?=.*?\pL)(?=.*?\pN)(?=.*[^\pL\pN])/
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...";
}
?>