Regex / Php:无法匹配实时网站中的问号

时间:2013-07-03 16:36:18

标签: php regex

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

1 个答案:

答案 0 :(得分:0)

试试\\\?代替 \? ;如果这不起作用,你可能会运行一个不支持负向前瞻的正则表达式引擎版本。

在这种情况下,您可以将preg_replace改为

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

将消耗非数字,但再次将其重新输入。可能存在与正则表达式不同的边缘情况,但我不认为你能够遇到那些带有url的情况(我无法从头脑中想到任何内容)

当然,还有其他非正则表达式的解决方案,但由于正则表达式是一个非常强大的工具,因此了解它的一些内容总是好的;)