• ベストアンサー

mb_ereg_replace関数の正規表現

PHPでmb_ereg_replace関数を使って、任意の文字列から文字列"あい"でない文字を抽出したいと考えております。 その際に、[^あい]と記述すると、"あ"又は"い"でない文字を抽出することになり目的を果たせません。 就いては、ブラケット内で文字列を扱う方法の有無および、あるのであればその方法、ないのであればその代替案をご教示いただきたくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

pregで厳密に行う場合はu修飾子をつけてください <?PHP mb_internal_encoding("UTF8"); $abc="a、b、cなど。"; $aiu="あ、い、うなど。"; $pattern="/(^[^な]+).+/u"; $replacement="$1"; print preg_replace($pattern,$replacement,$abc)."<br>"; print preg_replace($pattern,$replacement,$aiu)."<br>"; ?>

mic_goto
質問者

お礼

ありがとうございます。 お陰様で大分理解できました。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

ereg系の関数は戻り読みができなかったかもしれません preg_replaceではどうでしょう? (日本語処理を正確にするにはUTF8しばりになりますが) <?PHP $pattern="/a(?!i)|(?<!a)i|[^ai]/"; $replacement="_"; $array=array("xaiy","aau","aiu","ai","a","aiueoaiaioioia"); foreach($array as $val){ print $val."→".preg_replace($pattern,$replacement,$val)."<br>"; }

mic_goto
質問者

お礼

ご回答ありがとうございます。 preg_replaceは使ったことがないので、勉強してやってみたいと思います。 PHPマニュアルのpreg_replaceのページを読みましたが、preg系正規表現の仕組みがあまり理解できませんでした。 自分でも以下のコードを書いてみたのですが、なぜeregとpreg、"abc"と"あいう"で処理が異なるのか理解できておりません。 $abc="a、b、cなど。"; $aiu="あ、い、うなど。"; $abc_ereg=mb_ereg_replace('(^[^な]+).+','\\1',$abc); $abc_preg=preg_replace('/(^[^な]+).+/','${1}',$abc); $aiu_ereg=mb_ereg_replace('(^[^な]+).+','\\1',$aiu); $aiu_preg=preg_replace('/(^[^な]+).+/','${1}',$aiu); $abc_eregの結果は、a、b、c $abc_pregの結果は、a $aiu_eregの結果は、あ、い、う $aiu_pregの結果は、あ、い、うなど。 preg系正規表現の参考サイトで、プログラミング初修者にも分かり易いものがあれば是非ご教示ください。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>任意の文字列から文字列"あい"でない文字を抽出したい そもそもブラケットで括る必要はないのでは?

mic_goto
質問者

お礼

ご回答ありがとうございます。 ブラケットで括らないとなると、"^あい"と記述することなろうかとぞんじますが、そうすると、"あい"で始まる文字列を抽出することになり、目的を果たせないのではないでしょうか?