|
文字列に対して、EUC 全角(漢字)文字に完全対応したワードの置換処理を行います。 s/$word/$replace/g; でもある程度は可能な機能ですが、EUC 漢字が含まれているテキストの場合、 単純な1バイト処理だと EUC の1バイト、2バイト目の判別がつかないため、間違った置換を 行ってしまう場合があります。 本関数は、そのような場合でも正しく置換できます。 4番目の引数に0以外を指定しない場合は、Perlのメタ文字で使用する文字の前にバックスラッシュ を付加し、自動的にメタ文字を無効化します。 この場合は、正規表現が使えませんので注意が必要です。 この HTML 上では漢字がシフトJIS になっていますが、本来は EUC 向けとなっています。 シフトJISでも、半角カナなどがなければある程度動作しますが、若干の修正を行ったほうが 良いでしょう。 |
# 漢字完全対応ワード置換処理(EUC 向け,シフトJISでもある程度動作)
# s/$word/$replace/g; の代用品(可能性は低いが、漢字があると正しく動作しない可能性あり)
sub replace_allword
{
my($wk) = $_[0];
my($wd) = $_[1];
my($rp) = $_[2];
# 引数3が0ならば、メタ変換を実行
if ($_[3] = 0) {
# メタ文字の変換
# \ / | ( ) [ { ^ $ * + ? .
# 追加分 -
$wd =~ s/([\\\/\|\(\)\[\{\^\$\*\+\?\.\-])/\\\1/g;
$rp =~ s/([\\\/\|\(\)\[\{\^\$\*\+\?\.\-])/\\\1/g;
}
if (ord($wd) < 128) {
# サーチ文字の先頭が半角から始まるなら特に問題なし
$wk =~ s/$wd/$rp/g;
} else {
# 先頭が全角(2バイト文字)からの場合は要注意
my($sl) = length($wd);
my($lm1) = length($wk);
for (my($i) = 0 ; $i < $lm1 ; ) {
my($one) = substr($wk, $i, $sl); # 比較/置換する分だけ取り出し
if ( ord($one) >= 128 ) {
# 2 byte code
if ( $one =~ s/^$wd/$rp/ ) {
substr($wk, $i, $sl) = $one; # 置換した結果を戻す
$lm1 = length($wk); # 文字列長の修正
$i += length($one);
} else {
# 置換しない場合はそのまま進む
$i += 2;
}
} else {
# 1 byte code
$i++;
}
}
}
return ($wk);
}