07 August 2013

(php, perl) utf8文字コードで文字列置換 preg_replace

■ phpの場合

文字列置換関数 preg_replace は、文字列で検索パターンを指定すると

$str = preg_replace('/^[abcdefg]+/u', '', $str);

このようになるが、16進文字コード(utf8)で検索文字を指定する場合は、

$str_match = "/[".pack('CCC', 0xe6, 0x96, 0x87).pack('CCC', 0xe5, 0xad, 0x97)."]+/u";
$str = preg_replace($str_match, '', $str);

というように、一旦検索パターンを作業用の文字列に格納し、それを検索パターンとして指定すれば良いようだ。

ちなみに、上の例は
・pack('CCC', 0xe6, 0x96, 0x87) = '文'
・pack('CCC', 0xe5, 0xad, 0x97) = '字'

検証スクリプトの全文は次の通り

test.php
<?php
 
$str = 'これは、★文字★字★列★の一部を置換します';
$str_match = "/[".pack('CCC', 0xe6, 0x96, 0x87).pack('CCC', 0xe5, 0xad, 0x97)."]+/u";
$str = preg_replace($str_match, "xxxx", $str);
print "str=".$str.";";
 
?>


■ Perlの場合

test.pl
#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
binmode STDOUT,":utf8";
 
my $str = 'これは、★文字★字★列★の一部を置換します';
my $str_match = '['.pack('U0C*', 0xe6, 0x96, 0x87).pack('U0C*', 0xe5, 0xad, 0x97).']';
$str =~ s/$str_match//g;
print "str_match=".$str_match."\n";
print "str=".$str."\n";