14

utf-8phpファイルに次のphpコードがあります。

var_dump(setlocale(LC_CTYPE, 'de_DE.utf8', 'German_Germany.utf-8', 'de_DE', 'german'));
var_dump(mb_internal_encoding());
var_dump(mb_internal_encoding('utf-8'));
var_dump(mb_internal_encoding());
var_dump(mb_regex_encoding());
var_dump(mb_regex_encoding('utf-8'));
var_dump(mb_regex_encoding());
var_dump(preg_replace('/\bweiß\b/iu', 'weiss', 'weißbier'));

最後の正規表現では、単語の一部ではなく、完全な単語のみを置き換えてください。

私のWindowsコンピュータでは、次のように返されます。

string 'German_Germany.1252' (length=19)
string 'ISO-8859-1' (length=10)
boolean true
string 'UTF-8' (length=5)
string 'EUC-JP' (length=6)
boolean true
string 'UTF-8' (length=5)
string 'weißbier' (length=9)

Webサーバー(Linux)では、次のようになります。

string(10) "de_DE.utf8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(10) "ISO-8859-1"
bool(true)
string(5) "UTF-8"
string(9) "weissbier"

したがって、正規表現はWindowsでは期待どおりに機能しますが、Linuxでは機能しません。

したがって、主な質問は、単語の境界でのみ一致するように正規表現をどのように記述すればよいかということです。

2番目の質問は、phpアプリケーションでutf-8を使用することをWindowsに通知する方法です。

4

4 に答える 4

19

UTF-8モードでも、標準クラスの省略形はUnicodeに対応していません\w\bうまくいったので、Unicodeの省略形を使用する必要がありますが、交互の代わりにルックアラウンドを使用することで、少し醜くすることができます。

/(?<!\pL)weiß(?!\pL)/u

Unicodeクラスの省略形から中括弧を除外した方法にも注意してください。クラス名が1文字で構成されている場合は、これを行うことができます。

于 2010-03-15T17:12:57.133 に答える
5

これはバグ#52971に関連していると思います

PCRE-メタ-Unicode\b \w文字列で動作しないような文字。

PHP5.3.4で修正されました

PCRE拡張機能:バグ#52971を修正しましたPCRE-Meta-Charactersがutf-8で機能しない)。

于 2016-12-10T10:32:13.107 に答える
4

これが私がこれまでに見つけたものです。このように検索と置換のパターンを書き直すことによって:

$before = '(^|[^\p{L}])';
$after = '([^\p{L}]|$)';
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weißbier'));
// Test some other cases:
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', 'weiß bier'));
var_dump(preg_replace('/'.$before.'weiß'.$after.'/iu', '$1weiss$2', ' weiß'));

希望する結果が得られます:

string 'weißbier' (length=9)
string 'weiss' (length=5)
string 'weiss bier' (length=10)
string ' weiss' (length=6)

apacheを実行しているWindowsコンピューターとapacheを実行しているホストされているLinuxWebサーバーの両方で。

これを行うにはもっと良い方法があると思います。

また、Windowsコンピューターをutf-8に設定したいと思います。

于 2010-03-12T14:37:30.247 に答える
0

このコメントによると、これはPHPのバグです。\W代わりに使用することで\bメリットはありますか?

于 2010-03-14T14:25:24.407 に答える