web-dev-qa-db-ja.com

PHP正規表現のUTF-8

正規表現のサポートが必要です。私の文字列にはUnicode文字が含まれており、以下のコードは機能しません。

最初の4文字は数字、次にコンマ、そしてアルファベットまたは空白でなければなりません...正規表現の最後に/ uを追加すると、すでに読んでいますが、うまくいきませんでした...

私のコードは非Unicode文字で動作します

$post = '9999,škofja loka';;
echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+', $post);

あなたの答えをありがとう!

15
Gasper

更新された回答:
これは現在テストされ、機能しています

$post = '9999, škofja loka';
echo preg_match('/^\\d{4},[\\s\\p{L}]+$/u', $post);

\\wは、すべてのUnicode文字が含まれているわけではなく、文字に加えて[0-9_]も含まれているため、機能しません。

ユニコードモードをアクティブにするためのu修飾子も重要です。

カンマの後に文字またはの空白がある場合は、それらを同じ文字クラスに入れる必要があります。正規表現では、の後に0個以上の空白があります。カンマの場合は文字のみです。

Php正規表現の詳細については、 http://www.regular-expressions.info/php.html を参照してください。

\\p{L}(Unicode文字)について説明します ここ

また、文字列の終わりの境界$を使用して、文字列全体が実際に検証されるようにすることも重要です。そうしないと、最初の空白のみに一致し、残りは無視されます。

32
stema

[a-zA-Z]は、a-zからA-Zの範囲の文字にのみ一致します。 US-ASCII以外の文字を使用しているため、/u修飾子に関係なく、正規表現は一致しません。 Wordの文字エスケープシーケンス(\w)を使用する必要があります。

$post = '9999,škofja loka';
echo preg_match('/^[0-9]{4},[\s]*[\w]+/u', $post);
8
jmz

問題はあなたの正規表現です。 a b c ... z A B C ... Zのみを受け入れると明示的に言っています。 šはa-zセットにありません。 šは他の文字と同じようにsとは異なることを忘れないでください。

したがって、本当に文字のシーケンスが必要な場合は、Unicodeプロパティをテストする必要があります。例えば.

echo preg_match('/^[0-9]{4},[\s]*\p{L}+', $post);

\p{L}は、文字と見なされるすべてのUnicode文字と一致するため、これは機能するはずです。 AからZだけではありません。

7
Sodved

uを追加し、末尾のスラッシュを覚えておいてください。

echo preg_match('/^[0-9]{4},[\s]*[a-zA-Z]+/u', $post);

編集:

echo preg_match('/^\d{4},(?:\s|\w)+/u', $post);
0
searlea