想根据一些关键字来 把一篇文章中包含这些关键字的地方加上超链接
比如提供关键字 
'a','b','c'
文章内容如果是
" a is less than b test c"
替换之后会形成
<a href="test.php?word=a">a</a> is less than <a href="test.php?word=b">b</a> test <a href="test.php?word=c">c</a>从网上找了一个方法可以实现
function highlight_words($str, $words, $color = '#FFFF00') 
{    
if(is_array($words)) 
{       
foreach($words as $k => $word) 
   {    
     $pattern[$k] = "/\b($word)\b/is";    
    
     $replace[$k] = '<a href="test.php?words='.$word.'">\\1</a>';    
     
      
      }    
}    
else 
{    
   $pattern = "/\b($words)\b/is";    
 $replace = '<a href="test.php?words='.$words.'">\\1</a>';    
}    
     
return preg_replace($pattern,$replace,$str);    
}    
但是当我提供的关键字是短语的时候
比如关键字
" a is char","a is "
文章内容
" a is char ,b is char "
这样形成的链接就乱了
因为当关键字  a is char 的时候在上面加了一个链接  当处理到a is 的时候又在上面加了一个链接,

解决方案 »

  1.   

    比如关键字
    文章内容
    " a is char ,b is char "
    最简单的办法不是改正则代码,而是更改关键词的替换顺序。先替换"a is ",然后再替换 " a is char"  就可以了。
      

  2.   

    Append:如果你无法控制关键词的添加顺序,那么可以在进行关键词添加操作的时候先去 select * from TABLE keyword like '%{your post}%' ,如果能找到,那么就禁止添加关键词,或者对关键词增加字段进行排序用于正则替换时的顺序排列。 方法很多,不多说了。
      

  3.   

    试过这种方式
    结果是
    <a href="test.php?words=<a href="test.php?words=a is">a is</a> char"><a href="test.php?words=a is">a is</a> char</a> ,b is char显示不正常
      

  4.   


    根据猜测,我觉得你是打算做一个文章系统上的关键词高亮这样的东西,关键词是存放在一个单独的表里面的,可以在后台添加关键词,我提到的这个select查找语句只需要在添加的时候执行一次而已,你总不可能每天都在疯狂的添加关键词吧?所以这个问题不大,另外我提到对每个关键词给予一个排序ID的问题,这个也是可以实现的,只需要在正则之前从数据读取关键词select的时候order by 下排序ID就可以了。最好是能够看到代码去改…… 不习惯打字。
      

  5.   

    按我的思路 你应该考虑的是  IS A 是两个单词 怎么能放在一个 <a> 里呢?这样的东西 最好找实际的内容来测试 想你说的这种情况 例如内容是 每天回帖即可获得10分可用分那么 现在关键字是 '每天回帖' '回帖'那么 按字符串长度排序? 这个是挺不好弄的。。
      

  6.   

    好亲切啊楼主,我刚入门时候就是用的PB9啊。
    我不会写php,贴段c#的给你,你就当伪代码用把。按我意思修改一下语言。
    public string RegexBuilder(string[] words)
    {
        Array.Sort(words);//所有关键字按长度排序
        Array.Reverse(words);//默认是最短的在前面,我们逆序排列,避免先检测短的
        string exp = "";//定义变量记录正则表达式字符串
        foreach(string w in words)//循环关键字字符串数组,组合正则表达式
        {
            exp += w+"|"//每个关键字被替换为 关键字| 这样的格式
        }
        exp.TrimEnd("|");//最后会多余一个,我们把最后的|删除
        return exp;//返回正则表达式
    }void RegexReplace(string[] words,string html)
    {
        string exp = RegexBuilder(words);
        string result = Regex.Replace(html,exp,"<a href=\"test.php?word=$&\">$&</a>");
    }这里result就是你要的结果了。你贴的代码。是把每个关键字都独立匹配,和不用正则一样了。我这个才是正则的用法。不过不懂PHP,只能写到这样了。
      

  7.   

    好亲切啊楼主,我刚入门时候就是用的PB9啊。
    我不会写php,贴段c#的给你,你就当伪代码用把。按我意思修改一下语言。
    public string RegexBuilder(string[] words)
    {
        Array.Sort(words);//所有关键字按长度排序
        Array.Reverse(words);//默认是最短的在前面,我们逆序排列,避免先检测短的
        string exp = "";//定义变量记录正则表达式字符串
        foreach(string w in words)//循环关键字字符串数组,组合正则表达式
        {
            exp += w+"|"//每个关键字被替换为 关键字| 这样的格式
        }
        exp.TrimEnd("|");//最后会多余一个,我们把最后的|删除
        return exp;//返回正则表达式
    }void RegexReplace(string[] words,string html)
    {
        string exp = RegexBuilder(words);
        string result = Regex.Replace(html,exp,"<a href=\"test.php?word=$&\">$&</a>");
    }这里result就是你要的结果了。你贴的代码。是把每个关键字都独立匹配,和不用正则一样了。我这个才是正则的用法。不过不懂PHP,只能写到这样了。