0

Web サイトの最初の「ページ」アイテムの $_GET パラメータを削除したいと考えています。

以下は、ローカル サーバーのテスト スクリプトで完全に機能します。

$urls = array(
'http://www.foo.com/bar.html?p=1',  //should match
'http://www.foo.com/bar.html?p=23',
'http://www.foo.com/bar.html?p=120',
'http://www.foo.com/bar.html?baz=123&p=1'  //should match
);

foreach ($urls as $url) {

    echo $url . '<br>';

    echo preg_replace('/([\?&]p=1)(?!\d)/', '', $url) . '<p>';
}

これにより、次が生成されます。

http://www.foo.com/bar.html?p=1
http://www.foo.com/bar.html

http://www.foo.com/bar.html?p=23
http://www.foo.com/bar.html?p=23

http://www.foo.com/bar.html?p=120
http://www.foo.com/bar.html?p=120

http://www.foo.com/bar.html?baz=123&p=1
http://www.foo.com/bar.html?baz=123

ただし、ライブ サイトでは、一致することはありません。

さらに悪いことに、

str_replace('?p=1','',$url);

同様に機能しません。私は何が欠けていますか?1つのクエスチョン マークに一致することはできますが、その後に何かが続くとすぐに運が悪くなります。これは、str_replace と preg_replace の両方に当てはまります。明らかな何かが欠けているように感じますが、理解できません。ご協力ありがとうございました。

解決:

私の特定のケースでは、基盤となる Magento ショップ システムがすでに html_encoded 文字を提供していることが判明しました。これに加えて、最初のパラメーターが常にセッション ID であり、後で URL 文字列から削除されるという事実により、私のタスクは次のように簡単になりました

$url = str_replace('&amp;p=1', '', $url); 
4

1 に答える 1

0

試す \\\?それ以外の \?; それがうまくいかない場合は、否定先読みをサポートしていないバージョンの正規表現エンジンを実行している可能性があります。

その場合、 preg_replace を次のように変更できます

preg_replace('/([\?&]p=1)([^\d])/', '$2', $url) . '<p>';

これは非数字を消費しますが、再び元に戻します。これがあなたの正規表現と異なるエッジケースがあるかもしれませんが、URL を持つものに遭遇することはできないと思います (頭の上からは何も考えられません)。

もちろん、これに対する正規表現以外の解決策は他にもありますが、正規表現は非常に強力なツールであるため、それについて何かを学ぶことは常に良いことです ;)

于 2013-07-03T17:16:57.483 に答える