我创建了自己的简报模块,遇到了一个(大)问题。 系统会使用其他参数格式化所有网址,以跟踪Google Analytics中的点击次数。
e.g。 像这样的网址
变得像这样
http://www.domain.com/&utm_source=newsletter&utm_medium=e-mail&utm_campaign=test
和这样的网址
变得像这样
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参数总是包含一个问号而不是&符号吗?
答案 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);