查看完整版本: sablog-x 2.0 关键词高亮BUG

Gol 2008-8-20 18:44

sablog-x 2.0 关键词高亮BUG

自从成立了sablog-x 2.0查漏补缺小组之后,就没有干过什么事了,今天终于有发现了一个bug。
以前写日志,发现当tag关键词出现在超级链接里面的时候,其他的不在超链接里面的关键词不会高亮!
今天,不对,是昨天下午,发几段视频的时候,发现使用关键词ED的时候,插入的FLASH会被破坏掉,主要是字标里面<embed...里面有ed这个词。
首先帖到了论坛里面,一天了,没有人回答,后来和tension聊了一会,她告诉了我关键词高亮这段代码的位置(其实我也知道,不过还是谢谢了),晚上就决定来研究研究了。
现在是11点,打开了\include\func\front.func.php文件,跳转到123行高亮标签那里……[code]// 高亮标签 function highlight_tag($content, $tag) {     global $options;     $tag = trim($tag);     if(preg_match('/<a[^>]+?'.preg_quote($tag).'[^>]+?>/i',$content)) return $content;     if(preg_match('/<img[^>]+?'.preg_quote($tag).'[^>]+?>/i',$content)) return $content;     //有次数的替换     $content = preg_replace('/'.$tag.'/i','<a href="'.gettaglink(urlencode($tag)).'" onclick="tagshow(\''.$tag.'\');return false;">'.htmlspecialchars($tag).'</a>', $content, 1);     /*     替换所有     if(function_exists('eregi_replace')) {            $content = eregi_replace($tag, '<a href="'.$tagurl.'" onclick="tagshow(\''.$tag.'\');return false;" class="tagshow">'.htmlspecialchars($tag).'</a>', $content);        } else {         $content = str_replace($tag, '<a href="'.$tagurl.'" onclick="tagshow(\''.$tag.'\');return false;" class="tagshow">'.htmlspecialchars($tag).'</a>', $content);        }     */     return $content; } [/code]发现除了几个单词认得以外,都看不懂。只知道匹配的规则是正则表达式。于是百度了一个正则表达式来学习。看第5行和第6行,知道了,如果是在<a>和<img>里面的关键字,就结束对这个关键词的高亮。开始还以为在这里面再加上比如<embed>之类的就行了。后来重新想了一下,如果关键词出现在这个里面,也就是匹配成功,程序就不会对该关键词高亮了,这样的话,其他的不在<>里面的关键词也不会高亮了。可见这两行是4ngle偷懒写的(4ngle请见谅)。
看来只能从第9行的替换规则入手了。回想一下那里的关键字才需要高亮,高亮的关键字得是我们在屏幕上面能够看到的,我们所看到的输出的结果都在<>字标外。
这样,我就得到了关键词的匹配规则,我只需要判断“在关键词前面,离它最近的一个>和关键词之间没有<”就能够表明关键词在<>外面。匹配规则是【在“>”后面,不包含“<”,关键词】,那个不包含很重要,不包含是排除了><embed>这样的情况,因为ed前面有>,所以会高亮,但是其还是在<>里面,所以必须加上在>和ed(关键词)之间不包含<这个规则。
匹配之后,把关键词替换高亮就OK了。
所以最后代码就修改成了[code]// 高亮标签 unction highlight_tag($content, $tag) {    global $options;    $tag = trim($tag);     //有次数的替换    $content = preg_replace('/>([^<]*)'.$tag.'([^>]*)<([^>]*)([^a])>/i','>$1<a href="'.gettaglink(urlencode($tag)).'" onclick="tagshow(\''.$tag.'\');return false;">'.htmlspecialchars($tag).'</a>$2<$3$4>', $content, 1);    /*    替换所有    if(function_exists('eregi_replace')) {           $content = eregi_replace($tag, '<a href="'.$tagurl.'" onclick="tagshow(\''.$tag.'\');return false;" class="tagshow">'.htmlspecialchars($tag).'</a>', $content);       } else {        $content = str_replace($tag, '<a href="'.$tagurl.'" onclick="tagshow(\''.$tag.'\');return false;" class="tagshow">'.htmlspecialchars($tag).'</a>', $content);       }    */    return $content; [/code]写了点自己学习和分析的过程,替换所有关键词我觉得没有必要,我自己也就没有修改,那个里面完全就是直接的替换,没有做任何判断。我觉得替换一次,给搜索引擎看就可以了,多了也不好。
今天学会的东西——正则表达式
最后附上这个修改过的文件,偷懒的话可以直接下载覆盖。
页: [1]
查看完整版本: sablog-x 2.0 关键词高亮BUG