当我处理很多特殊字符时,我往往会失去踪迹。
我有一些网址(格式错误,不足以使用parse_url),我想要替换所有出现的参数?dead和/或?dead = some_text_here什么都没有。
之前和之后可能还有其他变量。
示例网址:
http://www.url.com/?dead?dead=whatever_text&wow=test
http://www.url.com/?hello?dead=whatever_text
这是我认为会起作用的,但它没有。
$parsed_url = preg_replace("/(\?dead(?:=.*?)?)(?:\&|$|\?)/", "", $url);
它应该做的是检查"?dead",后面有一个可选的=值,然后用什么都替换它。但这也取代了?和&amp ;,如果?dead参数后面有参数。它也只是替换了1次,而不是全部。
它使
http://www.url.com/?dead?dead=whatever_text&wow=test
成为
http://www.url.com/dead=whatever_text&wow=test
答案 0 :(得分:1)
我想你想要这样的模式?
(\?dead(=[^&]*|))*
PHP代码:
echo preg_replace('/(\?dead(=[^&]*|))*/','',$sourcestring);
这将产生您给定网址的输出:
http://www.url.com/&wow=test
http://www.url.com/&wow=test
http://www.url.com/?hello
答案 1 :(得分:0)
在处理大量特殊字符时,您可以使用\Q
and \E
(如在QuotE中)。
这些分隔符之间的文字将按字面处理。
答案 2 :(得分:0)
怎么样:
$parsed_url = preg_replace("/\?dead(?:=[^&?]*)?/", "", $url);
默认情况下, preg_replace
应匹配所有出现次数(默认情况下$limit
参数为-1
。)
此正则表达式与您的正则表达式非常相似,但它使用.*
代替[^&?]*
进行匹配,直到下一个?
或&