url参数正则表达式

时间:2011-04-15 13:16:53

标签: php regex

我创建了自己的简报模块,遇到了一个(大)问题。 系统会使用其他参数格式化所有网址,以跟踪Google Analytics中的点击次数。

e.g。 像这样的网址

  

http://www.domain.com

变得像这样

  

http://www.domain.com/&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test

和这样的网址

  

http://www.domain.com/?page=1

变得像这样

  

http://www.domain.com/?page=1&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test

第一个例子是虚假的。我知道第一个&符号必须用&符代替,这就是问题发生的地方。 我正在使用这种模式来提取网址

$pattern = array('#[a-zA-Z]+://([-]*[.]?[a-zA-Z0-9_/-?&%\{\}])*#');
$replace = array('\\0&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test');
$body = preg_replace($pattern,$replace,$body);

任何人都可以帮助我使用正确且正常工作的正则表达式,所以第一个url参数总是包含一个问号而不是&符号吗?

4 个答案:

答案 0 :(得分:1)

只需使用

if(strpos($string,'?') !== false)
//add with ampersand
else
//add with question mark

答案 1 :(得分:0)

不是正则表达式,但它会起作用。它只是检查一下?如果没有找到,请更改第一个&问号。:

$url = (substr_count($url, '?')>0) ? $url : str_replace('&', '?', $url, 1);

答案 2 :(得分:0)

一种非常简单的方法是查找http://...&之类的字符串,其中...不包含?个问号或其他分隔符:

= preg_replace('#(http://[^\s"\'<>?&]+)&#', '$1?', $src);

但是如果你使用受限制的而不是否定的角色类,那可能是最好的:

$src = preg_replace('#(http://[\w/.]+)&#', '$1?', $src);

答案 3 :(得分:0)

此解决方案修复了查询以&开头的所有网址(并且缺少?):

$re = '%([a-zA-Z]+://[^?&\s]+)&(utm_source=newsletter)%';
$body = preg_replace($re, '$1?$2', $body);