こんにちは、5 つ以上の連続する数字をチェックする次のコードがあります。
if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;
英語の入力では問題なく動作しますが、入力文字列にアラビア語/マルチバイト文字が含まれているとつまずきます。入力テキストに数字がなくても true を返すことがあります。
何か案は ?
こんにちは、5 つ以上の連続する数字をチェックする次のコードがあります。
if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;
英語の入力では問題なく動作しますが、入力文字列にアラビア語/マルチバイト文字が含まれているとつまずきます。入力テキストに数字がなくても true を返すことがあります。
何か案は ?
PHPを使用しているようです。
これを行う:
if (preg_match("/\d{5}/u", $input, $matches) > 0)
return true;
式の最後にある「u」修飾子に注意してください。これは preg_* にマッチングに unicode モードを使用するように指示します。
UTF-8を処理する場合は、適切に設定する必要があります。
PCREUTF-8フラグを有効にしてphpを再コンパイルできます。
(*UTC8)
または、正規表現の先頭にシーケンスを追加することもできます。例えば:
/(*UTF8)[[:alnum:]]/
、入力é
、出力TRUE
/[[:alnum:]]/
、入力é
、出力FALSE
。
http://www.pcre.org/pcre.txtをチェックしてください。これには、PCREライブラリでのUTF-8サポートに関する多くの情報が含まれています。
UTF-8 モードであっても、事前定義された文字クラスは ASCII 文字と同様\d
で、[[:digit:]]
ASCII 文字のみに一致します。非 ASCII の可能性のある数字と一致させるには、同等の Unicode プロパティを使用する必要があります\p{Nd}
。
$s = "12345\xD9\xA1\xD9\xA2\xD9\xA3\xD9\xA4\xD9\xA5";
preg_match_all('~\p{Nd}{5}~u', $s, $matches);
特定の文字または範囲に一致させる必要がある場合は\x{HHHH}
、適切なコード ポイントでエスケープ シーケンスを使用できます。
preg_match_all('~[\x{0661}-\x{0665}]{5}~u', $s, $matches);
...または\xHH
フォームを使用して、UTF-8 でエンコードされたバイト シーケンスを入力します。
preg_match_all("~[\xD9\xA1-\xD9\xA5]{5}~u", $s, $matches);
この最後の例では二重引用符に切り替えたことに注意してください。およびフォームは正規表現コンパイラによって処理されるように渡されましたが\p{}
、\x{}
今回はPHPコンパイラにエスケープ シーケンスを展開させます。これは、単一引用符で囲まれた文字列では発生しません。