0

我想删除网站上第一个“页面”项目的 $_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);

也不会工作。我错过了什么?我可以匹配一个问号,但是一旦出现问题,我就不走运了。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 回答