我一直用锤子打破我的头脑,但这里有。我正在抓取我从各种来源获得的一些页面,并且URL通常以这种方式附加到其末尾的Google Analytics垃圾:
&utm_medium=something&utm_source=other
我正试图摆脱网址中的内容。由于这些附加在URL的末尾,我这样做:
$pattern = "^utm_source.*^";
$interUrl = preg_replace($pattern, '', $url);
utm_source是Google Analytics的网址的必需部分。这是我的问题出现了。出于某种原因,我不能让模式匹配如此的&符号:“^ \& utm_source。* ^”。没有&符号(和它的逃脱),我得到匹配。所以我认为“没什么大不了的,我只会对一个子系统”如此:
$finalUrl = substr($interUrl, 0, strlen($interUrl) - 1);
但没有任何反应。我将-1数增加到-3或甚至-4,但没有被切断,甚至没有字符后的&符号。我也尝试了str_replace甚至rtrim,但没有人可以过滤掉&符号。这是令人沮丧的,因为我留下了错误的URL。不仅如此,当我尝试卷曲页面时,我得到404,如果我通过浏览器访问该网站,我会被重定向到正确的页面。
关于为什么会发生这种情况的任何想法?
ANSWER
虽然所有答案都很好并且技术性很强,但我一直在用正则表达式进行尝试,直到我想出了什么。由于某些原因(可能是我的检索方法),URL被编码,所以我最终调整了正则表达式,如下所示:
$pattern = "/&utm_source.*/";
它有效!谢谢大家的帮助!
答案 0 :(得分:2)
在您的情况下,在reg表达式前面添加&
会使交易成为^&utm_source.*^
<?php
$ptn = "^&utm_source.*^";
$str = "http://someurl.com?index.php&utm_medium=something&utm_source=other";
$rpltxt = "";
echo preg_replace($ptn, $rpltxt, $str); // http://someurl.com?index.php&utm_medium=something
?>
我通常使用explode()
来简化操作,但是你需要重新组合网址
但您可以尝试parse_url()
而不是正则表达式,在这种情况下可能更合适。
答案 1 :(得分:0)
您可以使用parse_str
和http_build_query
parse_str($url, $vars);
if (isset($vars['utm_source'])) unset($vars['utm_source']);
// unset any other unwanted params the same way...
$finalUrl = http_build_query($vars);
答案 2 :(得分:0)
像其他人建议的那样使用parse_url:
<?php
$str = 'http://www.mydomain.com/something.php?herp=derp&some=thing&utm_medium=something&utm_source=other';
$url_arr = parse_url($str);
$query_arr = explode('&', $url_arr['query']);
$final_arr = array();
for($i=0;$i<count($query_arr);$i++) {
$tmp_arr = explode('=', $query_arr[$i]);
if(!preg_match('/^utm_/', $tmp_arr[0])) {
$final_query[] = $query_arr[$i];
}
}
echo $finished_url = $url_arr['scheme'] . '://' . $url_arr['host'] . $url_arr['path'] . '?' . implode('&', $final_query);
//output: http://www.mydomain.com/something.php?herp=derp&some=thing
答案 3 :(得分:0)
虽然所有答案都很好并且技术性很强,但我一直在用正则表达式进行尝试,直到我想出了什么。由于某些原因(可能是我的检索方法),URL被编码,所以我最终调整了正则表达式,如下所示:
$pattern = "/&utm_source.*/";
它有效。
为什么我不赶早抓住它?我在laravel上运行我的应用程序,每当我使用日志系统时,它似乎使用实际的&符号而不是&amp;因此看起来一切都很好。
有一次,我去检查数据库是否发生了什么,并注意到我的网址以&amp;结尾而不是和&amp; (它在我的观点中以这种方式出现)。
谢谢大家!