如果你想从你的脚本中抽象出所有讨厌的解析,你总是可以使用一个有很多可用的DOM解析器。对于这个示例,我选择了Simple HTML-DOM,因为它是我真正熟悉的唯一一个(诚然,它不是最有效的库,但您并没有做任何密集的事情)。
include 'simple_html_dom.php';
$html = str_get_html($htmlString);
foreach($html->find('a') as $a){
$url = strtolower($a->href);
if( strpos($url, 'http://me.com') === 0 ||
strpos($url, 'http://www.me.com') === 0 ||
strpos($url, 'http://') !== 0 // local url
){
$url = explode('?', $url, 2);
if(count($url)<2) $qry = array();
else parse_str($url[1], $qry);
$qry = array_merge($qry, array(
'utm' => 'some',
'medium' => 'stuff'
));
$parts = array();
foreach($qry as $key => $val)
$parts[] = "{$key}={$val}";
$a->href = sprintf("%s?%s", $url[0], implode('&', $parts));
}
}
echo $html;
在此示例中,我假设me.com是您的网站,并且本地路径也应该符合条件。我还假设查询字符串可能是简单的键:值对。在当前的形式中,如果 URL 已经具有您的查询参数之一,那么它将被覆盖。如果您想保留现有值,则需要交换array_merge
函数中参数的顺序。
输入:
<a href="http://me.com/">test</a>
<a href="http://WWW.me.com/">test</a>
<a href="local.me.com.php">test</a>
<a href="http://notme.com">test</a>
http://me.com/not-a-link
<a href="http://me.com/?id=10&utm=bla">test</a>
输出:
<a href="http://me.com/?utm=some&medium=stuff">test</a>
<a href="http://www.me.com/?utm=some&medium=stuff">test</a>
<a href="local.me.com.php?utm=some&medium=stuff">test</a>
<a href="http://notme.com">test</a>
http://me.com/not-a-link
<a href="http://me.com/?id=10&utm=some&medium=stuff">test</a>