• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現について(preg_replace))

正規表現について(preg_replace)

このQ&Aのポイント
  • 正規表現を使用して特定のパラメータ以外を除去したい
  • パラメータ k, pr, mrr, op の値を残す方法を教えてください
  • preg_replace を使用してパラメータを除去した結果が意図しないものになる

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

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

>sedコマンドでファイル全体を一括で置換 sedには詳しくないので正確なところはわかりませんが sedの正規表現は先読み・戻り読みなどができないのでは? 今回の私のソースはいわゆるPerl互換PCREでの処理なので sedでは厳しいような気がします http://php.net/manual/ja/book.pcre.php むしろPerlなり、CLIモードのPHPなりで処理する方が現実的では?

seiroku55
質問者

お礼

ありがとうございました! >sedの正規表現は先読み・戻り読みなどができないのでは? なるほど。よく理解できました。 今回本当に勉強になりました。 ありがとうございます。

その他の回答 (3)

noname#243182
noname#243182
回答No.3

「parse_url()」か「$_SERVER['QUERY_STRING']」から現在のクエリを持ってきて、これを「parse_str()」で連想配列にすると作業しやすいのではないでしょうか。間引きをしたら「http_build_query()」で組み立て直して、諸々繋げて書き戻すという流れです。 $url = "http://www.example.com/index.jsp?****************&k=zp&pr=abc&guid=ON&param=adfdOI%G_D000&pr=aaaa&mrr=aaaa&op=bbb"; $url = parse_url($url); parse_str($url['query'], $params); // ここで間引きする。 $query_string = http_build_query($params); // 組み立て直して書き戻し。

seiroku55
質問者

お礼

ありがとうございます。 parse_url関数のことを知らなかったので、勉強になりました(_ _)

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

ぱっと思い付き2段階でやるのが早そう <?PHP $pattern1="/(?<=[?&])(?:((?:k|pr|mrr|op)?=.*?(?:&|$))|(.*?=.*?(?:&|$)))/"; $pattern2="/&$/"; $str="ttp://xxx/index.jsp?****************&k=zp&pr=abc&guid=ON&param=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&param=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"; ?>

seiroku55
質問者

お礼

ありがとうございます。 これぞ、探し求めていたものでした。 すごいです。私からすると神業です! コレをsedコマンドでファイル全体を一括で置換できたらと思いました。 (や|をエスケープしてみたり、いろいろ試してみたのですが、それでは動かないのですよね。 ケツのアンドは付いたままでまったく問題ないです。 もしよろしければsedコマンドでもできる表現を教えていただけないでしょうか。 ずうずうしくすみません。よろしくお願いいたします。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

無理に正規表現でやらなくてもいいんじゃないですかねぇ。普通に分解してから結合する方が楽だとおもいます。 <?php $str = "http://XXX/index.jsp?****************&k=zp&pr=abc&guid=ON&param=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;

seiroku55
質問者

お礼

ありがとうございます! やっぱり一度では無理ですかね。 参考にさせていただきます!

関連するQ&A