[PHP-users 29514] Re: UTF-8、正規表現で全角スペースがヒットしないことがある?

goungoun gounx2 @ gmail.com
2006年 6月 27日 (火) 09:16:16 JST


こんにちは。

On Mon, 26 Jun 2006 20:50:36 +0900
ゆむ <qqqz9b69 @ green.ocn.ne.jp> wrote:

> 
> 手元の環境で試してみました。
> WindowsXP/PHP4.4.2cli
> 1:あ <まっち>うえ<br />
> 2:あ い うえ<br />
> 3:あ い <まっち><br />
> 4:あ い <まっち><br />
> 
> WindowsXP/PHP5.1.2cli
> 1:あ <まっち>うえ<br />
> 2:あ <まっち>うえ<br />
> 3:あ い <まっち><br />
> 4:あ い <まっち><br />
> 
> FreeBSD5.4/PHP5.1.4cli
> 1:あ <まっち>うえ<br />
> 2:あ <まっち>うえ<br />
> 3:あ い <まっち><br />
> 4:あ い <まっち><br />
> 
> FreeBSD5.4/PHP4.3.9cli
> 1:あ <まっち>うえ<br />
> 2:あ い うえ<br />
> 3:あ い <まっち><br />
> 4:あ い <まっち><br />
> 
> PHP5にしろと言うことですかね…。

あらら・・・
PHP4とPHP5で挙動が違うということは、
PHP4のバグをPHP5では修正した。と解釈した方がよさそうですね(汗

ざくっとまとめると、
・PHP4系列で文字コードUTF-8環境において、
・正規表現のキャラクタクラス(ex.[abc])に全角スペースを含む場合、
   mb_ereg_replace("い[ ]", "<まっち>", $text, 'i')

*期待した動作にならない*

ということですね。

回避案としては、
「キャラクタクラス中に全角スペース」を使うことがNGなので、

1.全角スペースを使用頻度の低い 文字並び or 全角文字 に置換
2.置換した文字を使って正規表現記述して処理させる。
3.1.の逆置換を行いもとに戻す。

のように遠回りするしかなさそうですね。

# 必ずしも全角スペースを保持する必要がないのであれば、
# 全角スペースを半角スペースに置換がスマートかな。。


最後になりましたが、多くの環境で確認頂き
ありがとうございました<(_ _)>





> 
> ----
> ゆむ
> 
> > -----Original Message-----
> > From: php-users-bounces @ php.gr.jp
> > [mailto:php-users-bounces @ php.gr.jp] On Behalf Of goungoun
> > Sent: Monday, June 26, 2006 4:37 PM
> > To: php-users @ php.gr.jp
> > Subject: [PHP-users 29510] UTF-8、正規表現で全角スペースがヒットしないこと
> がある?
> >
> > はじめまして。
> > こちらには初投稿になります。
> >
> > 早速本題ですが、、
> >
> > 文字コードをUTF8で統一した環境で、mb_ereg_replace を使っていたところ
> > 正規表現のキャラクタクラス(ex.[abcd])中に全角スペースを含む場合、意図した
> 通り
> > に動作させることができず悩んでいます。
> >
> > 詳しく書いてみます、、
> >
> > 以下をUTF-8で保存して・・・
> > # ps.文字列中の空白は全て全角スペースです。
> > --------------------------------------------------------------
> > --------------
> > <?php
> > mb_internal_encoding('UTF-8');
> > mb_regex_encoding('UTF-8');
> > $text = "あ い うえ";
> > echo "1:" . mb_ereg_replace("い ",   "<まっち>", $text, 'i') . "<br
> />\n";
> > echo "2:" . mb_ereg_replace("い[ ]", "<まっち>", $text, 'i') . "<br
> />\n";
> > echo "3:" . mb_ereg_replace("うえ",   "<まっち>", $text, 'i') . "<br
> />\n";
> > echo "4:" . mb_ereg_replace("う[え]", "<まっち>", $text, 'i') .
> > "<br />\n"; ?>
> > --------------------------------------------------------------
> > --------------
> >
> > 実行すると以下となりました。
> > --------------------------------------------------------------
> > --------------
> > 1:あ <まっち>うえ
> > 2:あ い うえ             ←★
> > 3:あ い <まっち>
> > 4:あ い <まっち>
> > --------------------------------------------------------------
> > --------------
> >
> > 私は、★行が以下となることを期待していたのですが。
> > --------------------------------------------------------------
> > --------------
> > 2:あ <まっち>うえ
> > --------------------------------------------------------------
> > --------------
> >
> >
> > 考えたことを書いてみます。
> >
> > a."え"を使った場合は、3:に対して4:となるのに、
> >   全角スペースを使った場合は、1:に対して2:になる。
> >   完全に全角スペースはダメというわけではなくキャラクタクラス([]の中)
> >   中に使った場合のみの問題?
> >
> > b.試しに、上記ソースの'UTF-8'部分を'EUC-JP'に書き換えて
> >   ソース自身もEUC-JPで保存して実行すると、期待通りの動作
> >   となりました。つまりUTF-8固有の問題?
> >
> > なお、こちらの環境は、以下の通りです。
> > ・PHP Version 4.4.1-pl1 (Windows)
> > ・php.ini
> >     mbstring.internal_encoding EUC-JP
> >
> > ちなみに以下も試してみましたが、期待通りの動作
> > とはなりませんでした。
> >
> > ・mbstring.internal_encoding を UTF-8に変更
> >
> > ・Linux環境
> >    PHP Version 4.3.10-16
> >    mbstring.internal_encoding  no value
> >
> >
> > 何か心当たりある方はコメントお願いいたします<(_ _)>
> >

-- 
goungoun <gounx2 @ gmail.com>
http://goungoun.dip.jp/app/



PHP-users メーリングリストの案内