用于向文本中的链接添加类的正则表达式

时间:2012-05-30 14:20:30

标签: php regex

这段代码我从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);
}

它的效果很好,但是如果已经有一个类,那么就会出现问题,在这种情况下它只会使属性加倍。

我想知道是否有办法只为现有的类属性添加新的类值?这是我的正则表达式安全区之外的方式。

1 个答案:

答案 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);