这段代码我从stackoverflow上的其他地方获取并修改了一下。它为字符串中的所有链接添加了一个类:
// adds class of ah_link to outbound links,
// This is intended as for use with tracking clicks on outbound links
private function add_tracking_link($html) {
// no extra class on these websites!
$follow_list = array($_SERVER['HTTP_HOST']);
return preg_replace('%(<a\s*(?!.*\brel=)[^>]*)(href="https?://)((?!(?:(?:www\.)?'.implode('|(?:www\.)?',$follow_list).'))[^"]+)"((?!.*\brel=)[^>]*)(?:[^>]*)>%', '$1$2$3"$4 class="ah_link ">',
$html);
}
它的效果很好,但是如果已经有一个类,那么就会出现问题,在这种情况下它只会使属性加倍。
我想知道是否有办法只为现有的类属性添加新的类值?这是我的正则表达式安全区之外的方式。
答案 0 :(得分:1)
首先从$ html中删除class属性,以确保没有其他class属性,然后执行你的正则表达式,如下所示:
$out = preg_replace('/(<a[^>]*?)(class\s*\=\s*\"[^\"]*?\")([^>]*?>)/','$1$3',$html);
$return = preg_replace(<your regex here>,'<your replacement class here>',$out);
即:
$out = preg_replace('/(<a[^>]*?)(class\s*\=\s*\"[^\"]*?\")([^>]*?>)/','$1$3',$html);
return preg_replace('%(<a\s*(?!.*\brel=)[^>]*)(href="https?://)((?!(?:(?:www.)?'.implode('|(?:www\.)?',$follow_list).'))[^"]+)"((?!.*\brel=)[^>]*)(?:[^>]*)>%',
'$1$2$3"$4 class="ah_link ">',$out);