如何使用查询生成器url参数将所有URL附加到字符串中?

时间:2015-07-01 07:16:43

标签: php query-string

我正在尝试替换正文字符串中的所有现有网址,以附加Google Analytics查询参数。它适用于没有参数的URL,但是对于已经有一些参数的URL,所有参数都会丢失。

    <?php
$add = array(
 'utm_source'=>'edm',
 'utm_medium'=>'email',
 'utm_campaign'=>'product_notify');
$doc = new DOMDocument();
$doc->loadHTML('First Link <a href="http://www.google.com">no param</a><br />
                Second Link <a href="http://www.google.com/">no param with /</a><br />
                Third Link <a href="http://www.google.com?query=one">one  param</a><br />
                Fourth Link <a href="http://www.google.com?query=one&q2=two">two  param</a><br />');

foreach($doc->getElementsByTagName('a') as $link){
    $url = parse_url($link->getAttribute('href'));
    $gets = isset($url['query']) ? array_merge(parse_str($url['query'])) : $add;
    $newstring = '';
    if(isset($url['scheme'])) $newstring .= $url['scheme'].'://';
    if(isset($url['host']))   $newstring .= $url['host'];
    if(isset($url['port']))   $newstring .= ':'.$url['port'];
    if(isset($url['path']))   $newstring .= $url['path'];
    $newstring .= '?'.http_build_query($gets);
    if(isset($url['fragment']))   $newstring .= '#'.$url['fragment'];
    $link->setAttribute('href',$newstring);
 }
 $html = $doc->saveHTML();
 echo $html;
 ?>

OUTPUT 第一个链接没有参数:

http://www.google.com/?utm_source=edm&utm_medium=email&utm_campaign=product_notify 

第三个链接一个参数:http://www.google.com/

如您所见,第一个Link工作正常。但第三个链接失去了原始参数。

请查看并提出我在做什么错误,以及如何在字符串中保留现有参数。

1 个答案:

答案 0 :(得分:0)

正如您在手册页上看到的http://php.net/parse_str,parse_str函数不会返回值数组,它会将其写入第二个参数并始终返回void。无论如何,你会在一个数组上调用array_merge。所以你可以拿走现有的一行:

$gets = isset($url['query']) ? array_merge(parse_str($url['query'])) : $add;

并将其替换为:

$params = array();
if (isset($url['query'])) {
    parse_str($url['query'], $params);
}
$gets = array_merge($params, $add);

最后你会得到这样的结果:http://codepad.org/5VIEcAWy