重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

PHPでmb_ereg_replace関数を使って、任意の文字列から文字列"あい"でない文字を抽出したいと考えております。

その際に、[^あい]と記述すると、"あ"又は"い"でない文字を抽出することになり目的を果たせません。

就いては、ブラケット内で文字列を扱う方法の有無および、あるのであればその方法、ないのであればその代替案をご教示いただきたくお願い申し上げます。

A 回答 (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>";
?>
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/10/05 17:47

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>";
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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系正規表現の参考サイトで、プログラミング初修者にも分かり易いものがあれば是非ご教示ください。

お礼日時:2012/09/25 07:24

>任意の文字列から文字列"あい"でない文字を抽出したい



そもそもブラケットで括る必要はないのでは?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2012/09/24 11:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!