2

「\uXXXX」を含む式を含む正規表現データベースを使用しています。これはもちろん、PHPPCREを壊します。

では、2つの部分からなる質問ですが、PCREにこれらのシーケンスを受け入れるように指示する方法はありますか?

そして、私はこの問題を回避しました。幸いなことに、それは1つのシーケンスだけでした。

$ regx = str_ireplace('\ u00a7'、'\ xa7'、$ regx);

しかし、私がやろうとしていたとき:

$ regx = preg_replace( "/ \\ u(\ w +)/ i"、 "\ x $ 1"、$ regx);

私はまだ得ていた-

警告:preg_replace()[function.preg-replace]:コンパイルに失敗しました:PCREはオフセット1で\ L、\ l、\ N {name}、\ U、または\uをサポートしていません

そして、単に\\ uではなく、\ u => \\\\ uを二重にエスケープする必要がありました。なぜそれが/より良い方法があるのでしょうか?注:この投稿に正しい文字列を取り込むには、実際には同じことを行う必要がありました。

更新:サーバーで5.3.3を実行

4

2 に答える 2

1
$regx = preg_replace("/\\u(\w+)/i", "\x$1", $regx);

これが機能しない理由は、円記号を二重にエスケープする必要があるためです。

現状では、\\uはPHPの二重引用符で囲まれた文字列の中にあります。これは、\\PHPによって1つのスラッシュにエスケープされることを意味します。

次に、この単一のスラッシュがPRCEに渡されるため、正規表現パーサーはを認識し\uます。\uは正規表現の有効なエスケープシーケンスではないため、これは失敗します。

PHP正規表現でバックスラッシュ文字を実際に一致させたい場合は、実際に4つのバックスラッシュを指定する必要があります。

$regx = preg_replace("/\\\\u(\w+)/i", "\x$1", $regx);

うん。それは醜いです。しかし、それはそうです。

技術的には、これはすべての正規表現のバックスラッシュに適用されるため、理論的に\wはダブルバックスラッシュも必要ですが、\wPHPには意味がないため、解析されないため、これや他のほとんどの問題を回避できます。これは便利な動作ですが、この場合のように、うまくいかない場合は混乱を招きます。

于 2013-02-04T15:14:11.730 に答える
1

\ uはPHPでは機能しませんが、\xは機能します。PCREドキュメントからの説明:

\x{hhh..} character with hex code hhh.. (non-JavaScript mode)
\uhhhh    character with hex code hhhh (JavaScript mode only)

修飾子uを忘れてはなりません。(「Javascriptモード」は「内部」フラグです)

Unicodeシーケンス(\uを\Uとして)を解釈する別の解決策は、intl / Transliterator(PHP> = 5.4)を使用することです。

$in = '\u0041\U00000062';
$out = transliterator_create('Hex-Any')->transliterate($in);
var_dump($out); # string(2) "Ab"
于 2013-02-04T16:28:11.330 に答える