- ベストアンサー
正規表現について(preg_replace)
- 正規表現を使用して特定のパラメータ以外を除去したい
- パラメータ k, pr, mrr, op の値を残す方法を教えてください
- preg_replace を使用してパラメータを除去した結果が意図しないものになる
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>sedコマンドでファイル全体を一括で置換 sedには詳しくないので正確なところはわかりませんが sedの正規表現は先読み・戻り読みなどができないのでは? 今回の私のソースはいわゆるPerl互換PCREでの処理なので sedでは厳しいような気がします http://php.net/manual/ja/book.pcre.php むしろPerlなり、CLIモードのPHPなりで処理する方が現実的では?
その他の回答 (3)
「parse_url()」か「$_SERVER['QUERY_STRING']」から現在のクエリを持ってきて、これを「parse_str()」で連想配列にすると作業しやすいのではないでしょうか。間引きをしたら「http_build_query()」で組み立て直して、諸々繋げて書き戻すという流れです。 $url = "http://www.example.com/index.jsp?****************&k=zp&pr=abc&guid=ON¶m=adfdOI%G_D000&pr=aaaa&mrr=aaaa&op=bbb"; $url = parse_url($url); parse_str($url['query'], $params); // ここで間引きする。 $query_string = http_build_query($params); // 組み立て直して書き戻し。
お礼
ありがとうございます。 parse_url関数のことを知らなかったので、勉強になりました(_ _)
- yambejp
- ベストアンサー率51% (3827/7415)
ぱっと思い付き2段階でやるのが早そう <?PHP $pattern1="/(?<=[?&])(?:((?:k|pr|mrr|op)?=.*?(?:&|$))|(.*?=.*?(?:&|$)))/"; $pattern2="/&$/"; $str="ttp://xxx/index.jsp?****************&k=zp&pr=abc&guid=ON¶m=adfdOI%G_D000&pr=aaaa&mrr=aaaa&op=bbb%22"; print "(1)ケツが指定パラメータなら問題ない<br>\n".preg_replace($pattern1,"$1",$str)."<br>\n"; $str="ttp://xxx/index.jsp?k=zp&****************&pr=abc&guid=ON&pr=aaaa&mrr=aaaa&op=bbb%22¶m=adfdOI%G_D000"; print "(2)ケツが指定外パラメータだとケツにアンドがのこる<br>\n".preg_replace($pattern1,"$1",$str)."<br>\n"; print "(3)しょうがないのでケツのアンドをとる<br>\n".preg_replace($pattern2,"",preg_replace($pattern1,"$1",$str))."<br>\n"; ?>
お礼
ありがとうございます。 これぞ、探し求めていたものでした。 すごいです。私からすると神業です! コレをsedコマンドでファイル全体を一括で置換できたらと思いました。 (や|をエスケープしてみたり、いろいろ試してみたのですが、それでは動かないのですよね。 ケツのアンドは付いたままでまったく問題ないです。 もしよろしければsedコマンドでもできる表現を教えていただけないでしょうか。 ずうずうしくすみません。よろしくお願いいたします。
- shimix
- ベストアンサー率54% (865/1590)
無理に正規表現でやらなくてもいいんじゃないですかねぇ。普通に分解してから結合する方が楽だとおもいます。 <?php $str = "http://XXX/index.jsp?****************&k=zp&pr=abc&guid=ON¶m=adfdOI%G_D000&pr=aaaa&mrr=aaaa&op=bbb"; list($host, $qstr) = explode('?', $str); $param = explode('&', $qstr); $url = $host . '?'; $need = array(); foreach ($param as $val) { if (strpos($val, 'k=') === 0) { $need[] = $val; } if (strpos($val, 'pr=') === 0) { $need[] = $val; } if (strpos($val, 'mrr=') === 0) { $need[] = $val; } if (strpos($val, 'op=') === 0) { $need[] = $val; } } $url .= implode('&', $need); print $url;
お礼
ありがとうございます! やっぱり一度では無理ですかね。 参考にさせていただきます!
お礼
ありがとうございました! >sedの正規表現は先読み・戻り読みなどができないのでは? なるほど。よく理解できました。 今回本当に勉強になりました。 ありがとうございます。