• ベストアンサー

PHP、正規表現の使い方

PHPで特定の文字列から特定の文字までを削除したいのですが、 正規表現を使うということはわかりましたが、どのようにしていいかがいまいちわかりません。 http://www.sample.php?a=test&b=ex&c=sample という文字列があったとして、 &b=exを取り除きたい場合はどのようにしたらいいのでしょうか。 mb_ereg_matchを使用しようと思っていますが、 その他の方法があればそちらも教えてください。

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

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

若干深読みして・・・ b=・・・が頭にくる、中間にくる、お尻にくる、それしかないなどのパターンを 想定すると以下のようなかんじで・・・ <? $pattern=Array( "/(&b=.*?)(?=&|$)/" ,"/(?<=\?)b=.*?&/" ,"/\?b=[^&]*$/" ); $str="http://www.sample.php?a=ex1&b=ex2&c=ex3"; $str=preg_replace($pattern,"",$str); print $str."<br>"; $str="http://www.sample.php?a=ex1&c=ex3&b=ex2"; $str=preg_replace($pattern,"",$str); print $str."<br>"; $str="http://www.sample.php?b=ex2&a=ex1&c=ex3"; $str=preg_replace($pattern,"",$str); print $str."<br>"; $str="http://www.sample.php?b=ex2"; $str=preg_replace($pattern,"",$str); print $str."<br>"; $str="http://www.sample.php?b="; $str=preg_replace($pattern,"",$str); print $str."<br>"; ?>

hukazuo
質問者

お礼

ありがとうございます。 まさに求めてたものです!!

その他の回答 (4)

  • think49
  • ベストアンサー率59% (285/482)
回答No.5

一応確認しますが、ホスト名とかスキームとかの正規チェックはしなくていいのですよね…? 「URLとして正しい文字列である」として、"&b=ex" の前後をチェックすれば期待通りに削除できると思います。 <?php $url = array(  'http://www.sample.com/test.php?a=test&b=ex&c=sample', // b= が真ん中にある場合  'http://www.sample.com/test.php?b=ex&a=test&c=sample', // b= が先頭にある場合  'http://www.sample.com/test.php?a=test&c=sample&b=ex', // b= が末尾にある場合  'http://www.sample.com/test.php?ab=test&bb=sample&b=ex&db=hoge' // b= で終わるパラメータがたくさんある場合 ); header('Content-Type: text/plain; charset=UTF-8'); var_dump($url); // 削除前 $url = preg_replace('/(?<=\?)b=[^&]*(?:\&?|$)|\&b=[^&]*(?=$|\&)/', '', $url); // 削除(置換) var_dump($url); // 削除後 ?> 正規表現は最長一致が基本なので (?=$|\&) は要らないかもしれませんが、念のため。(好みもあります) # 配列を一括置換できるのはPHPの凄いところだと思う、この頃。

hukazuo
質問者

お礼

ありがとうございました!

noname#111181
noname#111181
回答No.4

$destに元の文字列を入れると、$sourに変換後の文字列が入ります。 b=の値は何でも構いません。また、b=の位置は先頭でも末尾でも構いません。 ---------------------------- $dest = 'http://www.sample.php?a=test&b=ex&c=sample' $sour = preg_replace('/&?b=[^&]*/', '', $dest);

hukazuo
質問者

お礼

ありがとうございました。 シンプルでいいですね。 是非活用したいと思います。

回答No.2

ereg関数がPHP5.3で非推奨になったこともありますから mb_ereg_match関数よりもpreg_match関数を使用することをお勧めいたします なお、日本語を含む文字列と利用する場合はオプションに「u」をつけてください(例:"/日本語/u") http://jp.php.net/manual/ja/function.preg-match.php ご質問への回答ですがmatchよりも置き換えてしまうreplaceを利用して以下のようなものではいかがでしょうか? なお「 [^&] 」は「&以外の任意の文字」「 [^&]* 」は「」「&以外の任意の文字が0個以上連続している文字列」を表します $str = "http://www.sample.php?a=test&b=ex&c=sample"; preg_replace("/&b=[^&]*/","",$str);

hukazuo
質問者

お礼

ありがとうございます。 eregは非推奨になってたのですね・・・。

  • higee
  • ベストアンサー率30% (4/13)
回答No.1

str_replace関数じゃ駄目ですか? 例) $str = "http://www.sample.php?a=test&b=ex&c=sample"; $str = str_replace("&b=ex","",$str);

hukazuo
質問者

お礼

ありがとうございました。

関連するQ&A