PHP - preg_replace と EUC
PHP - preg_replace と EUC
Perlの正規表現を利用したとき、preg_replace を使うと EUC の扱いに注意しなければならない。EUC では、好⊂スト なので 「好」という漢字を置き換えようとしたときに「スト」のスの2バイト目とトの1バイト目にマッチしてしまいます。
そこで、EUCを一旦 UTF-8 に変換して正規表現を利用します。しかし、処理が遅いのが欠点です。
ソースコード
<?php
// タグの外の文字をボールドに
$string = 'これは<a href="abc.php?d=好き">好き<a>なテストです。';
$replace = '好';
// 間違って置換してしまう
print preg_replace("/((?:\G|>)[^<]*?)($replace)/i", "\\1<b>\\2</b>", $string)."\n";
// 一旦、UTF-8 にして置換
print utf_preg_replace("/((?:\G|>)[^<]*?)($replace)/i", "\\1<b>\\2</b>", $string)."\n";
function utf_preg_replace($pattern, $replacement, $subject, $limit=-1) {
$pattern = mb_convert_encoding($pattern, "UTF-8", "eucjp-win");
$replacement = mb_convert_encoding($replacement, "UTF-8", "eucjp-win");
$subject = mb_convert_encoding($subject, "UTF-8", "eucjp-win");
$subject = preg_replace($pattern, $replacement, $subject, $limit);
$subject = mb_convert_encoding($subject, "eucjp-win", "UTF-8");
return $subject;
}
?>
このページは UTF-8 で記述しているのでコピペしてテストすることはできません。もう UTF-8 が当たり前だからこのページも不要でですが・・・
【実行結果】
オリジナルの文字列: これは好きなテストです。 preg_replace の場合文字化けする: これは好きなテ�好箸任后� utf_preg_replace の場合: これは好きなテストです。