public static function parse_related_link($content, $extent) {
global $_G;
loadcache('relatedlink');
$allextent = array('article' => 0, 'forum' => 1, 'group' => 2, 'blog' => 3);
if($_G['cache']['relatedlink'] && isset($allextent[$extent])) {
$searcharray = $replacearray = array();
foreach($_G['cache']['relatedlink'] as $link) {
$link['extent'] = sprintf('%04b', $link['extent']);
if($link['extent'][$allextent[$extent]] && $link['name'] && $link['url']) {
$searcharray[$link[name]] = '/('.preg_quote($link['name']).')/i';
$replacearray[$link[name]] = "<a href="$link[url]" target="_blank" class="relatedlink">$link[name]</a>";
}
}
if($searcharray && $replacearray) {
$_G['trunsform_tmp'] = array();
$content = preg_replace("/(<scripts+.*?>.*?</script>)|(<as+.*?>.*?</a>)|(<imgs+.*?[/]?>)|([attach](d+)[/attach])/ies", "helper_seo::base64_transform('encode', '<relatedlink>', '\1\2\3\4', '</relatedlink>')", $content);
$content = preg_replace($searcharray, $replacearray, $content, 1);
$content = preg_replace("/<relatedlink>(.*?)</relatedlink>/ies", "helper_seo::base64_transform('decode', '', '\1', '')", $content);
}
}
return $content;
}
上面是discuz的实现
后来在sf上还有人写出如下的正则
(?!(<.*?)|(<a .*?>.*?))核桃(?!([^><]*?/+>)|[^<]*</a>)
测试下来确实也对。
再加上script标签里的。
(?!(<.*?)|(<a .*?>.*?)|(<script .*?>.*?))核桃(?!([^><]*?/+>)|[^<]*</a>|[^<]*</script>)