替换关键词并过滤特殊标签
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("/(<script\s+.*?>.*?<\/script>)|(<a\s+.*?>.*?<\/a>)|(<img\s+.*?[\/]?>)|(\[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>)