2012-01-25 4 views
1

の違いを理解することはできません:はコメントアウト文字列元のコード(Drupalのコアモジュール)前回の現像液中で2つのするpreg_matchパターン

if (preg_match('/[^\x{80}-\x{F7} [email protected]_.\'-]/i', $name)) { 

、代わりに、追加:

if (preg_match('/[^\x{80}-\x{F7} [email protected]_.\'-]/iu', $name)) { 

ことができますこれら2つの違いを理解するのに役立ちますか?修飾子は何をしますか?私が見つけたPHPのドキュメントには:

U(PCRE8)
この修飾子は、Perlとの互換性がありませんPCREの追加機能をオンにします。パターン文字列はUTF-8として扱われます。この修飾子はUnixではPHP 4.1.0以降、win32ではPHP 4.2.3から利用可能です。パターンのUTF-8妥当性は、PHP 4.3.5からチェックされます。

これまでの開発者は、特殊文字などの解釈に問題があったと思います。私は少し困惑しています、このアドバイスをしてください。

答えて

4

修飾子が正しくUTF-8でエンコードされた入力を処理するために必要とされます。 \ xC1のようなパターンは、ユニコード文字U + 00C1(À)と一致する必要があります。あなたがutf-8でÁをエンコードすると、\ xC3 \ x81になるので、\ xC1は一致しません。 "u"修飾子は、アルゴリズムがutf-8を使用するようにします。あなたは、UTF-8でエンコードされたテキストを操作するとき

基本的に、これは何が起こるかです:

あなたのケースでは
<?php 
var_dump(preg_match('/\xC1/u', 'Á')); 
// => int(1), matches 

var_dump(preg_match('/\xC1/', 'Á')); 
// => int(0), doesn't match 
?> 

最初の正規表現[^ \ x80- \ XF7]一致していない(非ASCII) UTF-8は、UTF-8が動作する方法のためにエンコードされたテキストです。 2番目の式は、U + 0080 - U + 00F7の範囲外のUnicode文字と一致するので、キリル文字、ギリシャ語、アラビア語、ヘブライ語をすべて使用できます。

+0

この完全な説明をいただきありがとうございます! – Timus83

0

U - プリプレグマッチがAZ

ようなUTF-8文字列だけでなく、ISO-8859-1のためにチェックされることを意味

$what = 'łódka - русский алфавит'; 

if (preg_match_all('#([\w A-Za-z])#u',$what,$res)) : 
echo 'math eq' . 'łódka - русский алфавит'; 
endif; 
関連する問題