无法从PHP的URL末尾删除&符号

时间:2012-11-29 17:17:02

标签: php regex

我一直用锤子打破我的头脑,但这里有。我正在抓取我从各种来源获得的一些页面,并且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.*/";

它有效!谢谢大家的帮助!

4 个答案:

答案 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_strhttp_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 = "/&amp;utm_source.*/";

它有效。

为什么我不赶早抓住它?我在laravel上运行我的应用程序,每当我使用日志系统时,它似乎使用实际的&符号而不是&amp;因此看起来一切都很好。

有一次,我去检查数据库是否发生了什么,并注意到我的网址以&amp;结尾而不是和&amp; (它在我的观点中以这种方式出现)。

谢谢大家!