2010年1月20日水曜日

正規表現でかっこ()に囲まれた部分を全部削除したかった(解決)

正規表現で、ある文章からかっこ()に囲まれた部分を全部なくしたい、と思い、色々試してやっと実現できたので、メモです。
とにかく何でもいい文字の連続を表現するには、「.*」(ピリオドアスタリスク)でいけるんですね。
preg_replace("/(\(|().*(\)|))/","変えたよ",$str)
要するに、かっこの半角と全角の両方を|で認識させるようにして、半角かっこはもちろんバックスラッシュでエスケープして、それを半角かっこでくくってグループ化し、そのあとに閉じかっこも開きかっこと同様にグループ化して指定して、その間に.*を入れてカッコ内にどんな文字があってもOKになった、と。


やや時間がかかりました。。解決して嬉しいです(笑)
参考になったページはここ。とてもよく分かりましたm(_ _)m「サルにもわかる正規表現入門」。
http://www.mnet.ne.jp/~nakama/

::::::::::::::::::::::::::::::::::::::::::

■追記:この方法に弱点を発見しました。。
いくつもの()に囲まれた部分が、同一文内にあると、一番最初の開きかっこから、一番最後の閉じかっこまでがくくられて、ひとつと認識されてしまい、途中の文章が全部ずっぱり消えてしまいます。。
.*は可能な限り最後までつなげられる、という法則があるからですね。。

さて、困りました。どうしようかな。。

■追記2:一応解決です。応急策。
preg_replace("/(\(|().{5,30}(\)|))/","OK",$str);
みたいに、間にある文字数をだいたい指定してやれば、まあまあいけそうです。ちょっとアナログちっく。

■追記3:指定した文字数がマルチバイトの文字数じゃないので、どうしよう、とおもったら、pregはuというutf-8オプションがあったので、uを追加してやると日本語を一文字として認識してくれたようです。ありがたや。。
preg_replace("/(\(|().{5,10}(\)|))/u","OK",$str);

0 件のコメント:

コメントを投稿