2011-01-07 8 views
3

こんにちはために働いていないすべてのI 5つの以上の連続した数字をチェックするこのコードは持っている:正規表現は、連続した数字を検出する - 英語以外の入力

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

それは英語で入力するために正常に動作しますが、それはです入力文字列にアラビア語/マルチバイト文字が含まれている場合にトリッピングする - 入力テキストに数字がない場合でもtrueを返すことがあります。

アイデア?

+1

誤った '$ input'を貼り付ける可能性がありますか?私はこのエラーを見て非常に興味があります。 –

答えて

0

UTF-8を扱うときは、正しく設定する必要があります。

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

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

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

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

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

+0

免責事項:これは純粋な研究でした。私はそれを自分で試していない。 –

+0

こんにちは、私はすでにUTF8を英語でも使用しています。問題はUTF8ではなく、マルチバイト文字でもっと詳しくです。説明を更新しました。 –

+0

@SherifBuzz:PCREフラグがサポートするものです。マルチバイトは、UTF-8にある程度固有のものです。 [1文字] ASCIIはそうでないとみなされます。あなたの英語の文字列がマルチバイトであることをどのように知っているか聞いてもよろしいですか? –

6

あなたはPHPを使用しているようです。

この操作を行います。

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

は、式の最後に 'U' 修飾子を注意してください。 preg_ *に、一致のためにユニコードモードを使用するよう指示します。

0

UTF-8モードでも、\d[[:digit:]]のような定義済みの文字クラスは、ASCII文字にのみ一致します。あなたが特定の文字または範囲を一致させる必要がある場合は、あなたと\x{HHHH}エスケープシーケンスを使用することができますいずれか

$s = "12345\xD9\xA1\xD9\xA2\xD9\xA3\xD9\xA4\xD9\xA5"; 
preg_match_all('~\p{Nd}{5}~u', $s, $matches); 

See it in action on ideone.com

:潜在的に非ASCII数字が一致するには、同等のUnicodeプロパティ、\p{Nd}を使用する必要があります適切なコードポイント:

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コンパイラでエスケープシーケンスを展開します。それはシングルクォートの文字列では起こりません。

関連する問題