php utf-8での正規表現の単語境界マッチング
-
19-09-2019 - |
質問
utf-8 php ファイルには次の 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 では機能しません。
そこで主な質問は、単語の境界でのみ一致するように正規表現をどのように記述すればよいでしょうか?
二次的な質問は、php アプリケーションで utf-8 を使用したいことを Windows にどのように知らせるかです。
解決
でもUTF-8モードでは、\w
と\b
などの標準クラス速記は、Unicode対応ではありません。あなたはちょうどあなたが働いたとして、Unicodeの簡略表記を使用する必要がありますが、あなたは前後参照の代わりに、交代を使用して、それは少し醜い作ることができます:
/(?<!\pL)weiß(?!\pL)/u
私はUnicodeのクラス速記のうち、中括弧を左にも注意してください。クラス名は単一の文字で構成されている場合、あなたはそれを行うことができます。
他のヒント
ここでは、私がこれまでに発見したものです。このような検索および置換パターンを書き換えることによります:
$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とApacheを実行しているホストされたLinuxのWebサーバ上で実行されている。
私はこれを行うには、いくつかのより良い方法があるとします。
また、私はまだUTF-8に私のWindowsコンピュータをのsetlocaleしたいと思います。
これに関連していたのではないかと推測します バグ #52971
PCRE-メタ文字のような
\b
\w
Unicode 文字列では機能しません。
PCRE 拡張子: バグ #52971 を修正しました (PCRE-Meta-Characters が utf-8 で機能しない).