3

こんにちは、5 つ以上の連続する数字をチェックする次のコードがあります。

if (preg_match("/\d{5}/", $input, $matches) > 0)
return true;

英語の入力では問題なく動作しますが、入力文字列にアラビア語/マルチバイト文字が含まれているとつまずきます。入力テキストに数字がなくても true を返すことがあります。

何か案は ?

4

3 に答える 3

6

PHPを使用しているようです。

これを行う:

if (preg_match("/\d{5}/u", $input, $matches) > 0)
return true;

式の最後にある「u」修飾子に注意してください。これは preg_* にマッチングに unicode モードを使用するように指示します。

于 2011-01-13T10:08:18.480 に答える
0

UTF-8を処理する場合は、適切に設定する必要があります。

PCREUTF-8フラグを有効にしてphpを再コンパイルできます。

(*UTC8)または、正規表現の先頭にシーケンスを追加することもできます。例えば:

/(*UTF8)[[:alnum:]]/、入力é、出力TRUE

/[[:alnum:]]/、入力é、出力FALSE

http://www.pcre.org/pcre.txtをチェックしてください。これには、PCREライブラリでのUTF-8サポートに関する多くの情報が含まれています。

于 2011-01-07T01:58:03.447 に答える
0

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);

ideone.com で実際の動作をご覧ください

特定の文字または範囲に一致させる必要がある場合は\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コンパイラにエスケープ シーケンスを展開させます。これは、単一引用符で囲まれた文字列では発生しません。

于 2011-01-17T02:45:40.230 に答える