- ベストアンサー
PHP、正規表現の使い方
PHPで特定の文字列から特定の文字までを削除したいのですが、 正規表現を使うということはわかりましたが、どのようにしていいかがいまいちわかりません。 http://www.sample.php?a=test&b=ex&c=sample という文字列があったとして、 &b=exを取り除きたい場合はどのようにしたらいいのでしょうか。 mb_ereg_matchを使用しようと思っていますが、 その他の方法があればそちらも教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
若干深読みして・・・ 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>"; ?>
その他の回答 (4)
- think49
- ベストアンサー率59% (285/482)
一応確認しますが、ホスト名とかスキームとかの正規チェックはしなくていいのですよね…? 「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の凄いところだと思う、この頃。
お礼
ありがとうございました!
$destに元の文字列を入れると、$sourに変換後の文字列が入ります。 b=の値は何でも構いません。また、b=の位置は先頭でも末尾でも構いません。 ---------------------------- $dest = 'http://www.sample.php?a=test&b=ex&c=sample' $sour = preg_replace('/&?b=[^&]*/', '', $dest);
お礼
ありがとうございました。 シンプルでいいですね。 是非活用したいと思います。
- saintandre
- ベストアンサー率31% (194/607)
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);
お礼
ありがとうございます。 eregは非推奨になってたのですね・・・。
- higee
- ベストアンサー率30% (4/13)
str_replace関数じゃ駄目ですか? 例) $str = "http://www.sample.php?a=test&b=ex&c=sample"; $str = str_replace("&b=ex","",$str);
お礼
ありがとうございました。
お礼
ありがとうございます。 まさに求めてたものです!!