14

PHP で名前に対して適度に寛容なバリデーターを作成しようとしていますが、最初の試みは次のパターンで構成されています。

// unicode letters, apostrophe, hyphen, space
$namePattern = "/^([\\p{L}'\\- ])+$/";

これは、最終的に への呼び出しに渡されpreg_match()ます。私が知る限り、これは一般的な ASCII アルファベットで動作しますが、Ă や 张 などのよりスパイシーな文字ではつまずくようです。

パターン自体に何か問題がありますか?もしかしたら\p{L}、自分が思っているよりも多くの仕事をすることを期待しているのだろうか?

それとも、入力が渡される方法と関係がありますか? 関連性があるかどうかはわかりませんが、フォーム ページで UTF8 エンコーディングを指定するようにしました。

4

5 に答える 5

29

問題はそれよりもはるかに単純だと思います:u 修飾子を指定するのを忘れました。Unicode 文字のプロパティは、UTF-8 モードでのみ使用できます

正規表現は次のようになります。

// unicode letters, apostrophe, hyphen, space
$namePattern = '/^[-\' \p{L}]+$/u';
于 2011-02-13T09:38:59.520 に答える
1

old patternUnicodeを次のように置き換えたい場合は、次のようにnew pattern記述します。

$text = preg_replace('/\bold pattern\b/u', 'new pattern', $text);

ここでのキーはu修飾子です

:サーバーphp versionは少なくともPHP 4.3.5

ここで述べたように パターン修飾子

u (PCRE_UTF8) この修飾子は、Perl と互換性のない PCRE の追加機能をオンにします。パターン文字列は UTF-8 として扱われます。この修飾子は、UNIX では PHP 4.1.0 以降、win32 では PHP 4.2.3 以降で利用できます。PHP 4.3.5 以降、パターンの UTF-8 有効性がチェックされます。

AgreeOrNotここでそのキーをくれた人に感謝しますpreg_replace アラビア語の単語全体に一致

私はそれを試してみましたが、ローカルホストで機能しましたが、リモートサーバーで試してみると機能しませんでした.PHP 4.3.5でphp.net start useu修飾子が使用されていることがわかりました. 、私はphpバージョンをアップグレードし、それは動作します

uこの方法がアラビア語ユーザーにとって非常に役立つことを知っておくことは重要です (عربي) - 私が信じているように - unicode はアラビア語に最適なエンコードであり、修飾子を使用しないと置換は機能しません。次の例を参照してください。あなたと一緒に働く

$text = preg_replace('/\bمرحبا بك\b/u', 'NEW', $text);

于 2013-10-08T21:42:01.950 に答える
0

まず第一に、これらを記述するときに二重引用符の代わりに単一のアポストロフィを使用すると、作業がずっと楽になります。バックスラッシュは 1 つだけで済みます。第二に、結合マーク\pMも含める必要があります。一致しない文字が見つかった場合は、その Unicode コード ポイントを調べてください。http://www.fileformat.info/info/unicode/を使用して、その場所を特定できます。http://hsivonen.iki.fi/php-utf8/は、UTF-8 プロパティを使用してデバッグするときに非常に貴重なツールであることがわかりました (検索する前に 16 進数に変換することを忘れないでください: array_map('dechex', utf8ToUnicode($text)))。

たとえば、Ă はhttp://www.fileformat.info/info/unicode/char/0102/index.htmであり、Lu にあることが判明したため、L はそれに一致する必要があり、私には一致します。もう 1 つの文字はhttp://www.fileformat.info/info/unicode/char/5f20/index.htmであり、これも isLetter であり、実際に私と一致します。コンパイルされた Unicode 文字テーブルはありますか?

于 2011-02-13T09:27:06.067 に答える
0

ここを見て、これが機能しない人は、/u異なる PHP バージョン間で Unicode スクリプトを使用すると一貫した結果が得られないことに注意してください。

例を参照してください: https://3v4l.org/4hB9e

関連:異なる PHP バージョン間でのタイ文字の一貫性のない正規表現の結果

于 2020-07-31T07:12:43.023 に答える
-1
<?php preg_match('/[a-zığüşöç]/u',$title)  ?>
于 2020-09-28T00:58:38.417 に答える