如何使用查询生成器 url 参数将所有 url 附加到字符串中?
How to append all urls in a string with query builder url parameters?
我正在尝试替换正文字符串中的所有现有 URL 以附加 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;
?>
输出
首先 Link 无参数:
http://www.google.com/?utm_source=edm&utm_medium=email&utm_campaign=product_notify
第三个Link一个参数:http://www.google.com/?
如您所见,第一个 Link 工作正常。但是第三个链接失去了它的原始参数。
请检查并建议我犯了什么错误,以及如何在字符串中保留现有参数。
正如您在此处的手册页上看到的那样 http://php.net/parse_str parse_str 函数没有 return 值数组,而是将其写入第二个参数和 return 始终无效。无论如何,您都会在单个数组上调用 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
我正在尝试替换正文字符串中的所有现有 URL 以附加 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;
?>
输出 首先 Link 无参数:
http://www.google.com/?utm_source=edm&utm_medium=email&utm_campaign=product_notify
第三个Link一个参数:http://www.google.com/?
如您所见,第一个 Link 工作正常。但是第三个链接失去了它的原始参数。
请检查并建议我犯了什么错误,以及如何在字符串中保留现有参数。
正如您在此处的手册页上看到的那样 http://php.net/parse_str parse_str 函数没有 return 值数组,而是将其写入第二个参数和 return 始终无效。无论如何,您都会在单个数组上调用 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