0

我一直在用锤子打断我的头来解决这个问题,但这里就可以了。我目前正在抓取从各种来源获得的一些页面,并且这些 URL 的末尾通常附有 Google Analytics 废话,以这种方式:

&utm_medium=something&utm_source=other

我正在尝试从 URL 中删除这些内容。由于这些附加在 URL 的末尾,我这样做:

 $pattern = "^utm_source.*^";
 $interUrl = preg_replace($pattern, '', $url);

utm_source 是用于谷歌分析的 URL 的必需部分。这是我的问题出现了。出于某种原因,我无法让模式匹配这样的&符号:“^\&utm_source.*^”。没有&符号(及其转义),我得到匹配。所以我想“没什么大不了的,我只是一个 substr”,如下所示:

 $finalUrl = substr($interUrl, 0, strlen($interUrl) - 1);

但什么也没有发生。我将 -1 数字增加到 -3 甚至 -4 但没有任何内容被切断,甚至连字符后面的字符也没有。我也尝试过 str_replace 甚至 rtrim 但没有一个可以过滤掉&符号。这令人沮丧,因为我留下了错误的 URL。不仅如此,当我尝试卷曲页面时,我得到一个 404,而如果我通过浏览器访问该站点,我会被重定向到正确的页面。

关于为什么会发生这种情况的任何想法?

回答

虽然所有的答案都很好而且技术性很强,但我一直在尝试使用正则表达式,直到我弄明白了一些事情。由于某种原因(可能是我的检索方法),这些 URL 被编码了,所以我最终调整了正则表达式,如下所示:

$pattern = "/&utm_source.*/";

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

4

4 回答 4

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(), 来简化事情,但是你需要重新组合 url

但是您可以尝试parse_url()代替正则表达式,在这种情况下它可能更合适。

于 2012-11-29T17:20:57.007 回答
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);
于 2012-11-29T17:35:53.650 回答
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
于 2012-11-29T17:42:28.603 回答
0

虽然所有的答案都很好而且技术性很强,但我一直在尝试使用正则表达式,直到我弄明白了一些事情。由于某种原因(可能是我的检索方法),这些 URL 被编码了,所以我最终调整了正则表达式,如下所示:

$pattern = "/&amp;utm_source.*/";

它有效。

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

有一次,我去检查数据库以了解正在发生的事情,并注意到我的 URL 以 & 而不是 & 结尾(它在我的视图中以这种方式显示)。

谢谢大家!

于 2012-11-29T18:01:26.827 回答