本帖最后由 lovewangya 于 2011-09-23 13:10:28 编辑

解决方案 »

  1.   

    1、深度优先
        if(isset($keywords[$article{$i}]['val']))//可以再加一个条件让其只替换最长的关键字count($keywords[$article{$i}])==1,但短的关键字就没办法替换了
        {
    if(count($keywords[$article{$i}])) {
    $t = find($article,$keywords[$article{$i}],$i+1,$pos+1);
    if($t['pos']) return $t;
    }

            $returnArr["pos"] = $pos;2、你的
     $article = substr($article,0,$i) . "<a href='{$url}'>" .  substr($article,$i,$i+$pos) ."</a>" . substr($article,$i+$pos,$len);
    存在算法问题,应为$article = substr($article,0,$i) . "<a href='{$url}'>" .  substr($article,$i,$pos) ."</a>" . substr($article,$i+$pos,$len);
      

  2.   

    谢谢老师的回答,但有两个算法问题,我刚才还是没办法解决:
    一:
     中国人你好吗?中国最强大,中国我要成功了。(这句话会替换两个"[color=#FF0000]中国",我项目要求只替换一个)[/color]
    二:
    中国中国人你好吗?中国最强大,中国我要成功了。(这句话"[color=#FF0000]中国人",没有加上替换链接)[/color]
    header("content-type:text/html;charset=UTF-8");
    function inIt($keywords)
    {
    $g_keywords = array();
    foreach($keywords as $key=>$val)
    {
    $temp='$g_keywords';
    $len=strlen($key);
    for($i=0;$i<$len;$i++){
    $temp.="['".$key{$i}."']";
    }
    eval($temp.="['val']='{$val}';");
    }
    return $g_keywords;
    }
    function replace($article,$keywords)
    {
    $len=strlen($article);
    for($i=0;$i<$len;$i++)
    {
    $returnArr = find($article,$keywords,$i);
    $pos = $returnArr["pos"];
    $url = $returnArr["url"];
    if($pos)
    {
    $addLength = strlen("<a href='{$url}>'</a>");
    $article = substr($article,0,$i) . "<a href='{$url}'>" .  substr($article,$i,$pos) ."</a>" . substr($article,$i+$pos,$len);
    $i   = $i+$pos+$addLength;
    $len = $len+$addLength;
    }
    }
    echo $article;
    }
    function find($article,$keywords,$i,$pos=1)
    {
    $returnArr = array();
    $returnArr["pos"] = false;
    $returnArr["url"] = false;
    if(!isset($article{$i})) 
    {
    return $returnArr;
    }
    // if(isset($keywords[$article{$i}]['val']))//可以再加一个条件让其只替换最长的关键字count($keywords[$article{$i}])==1,但短的关键字就没办法替换了
    // {
    // $returnArr["pos"] = $pos;
    // $returnArr["url"] = $keywords[$article{$i}]['val'];
    // return $returnArr;
    // }
    if(isset($keywords[$article{$i}]['val']))//可以再加一个条件让其只替换最长的关键字count($keywords[$article{$i}])==1,但短的关键字就没办法替换了
    {
    if(count($keywords[$article{$i}]))
    {
    $t = find($article,$keywords[$article{$i}],$i+1,$pos+1);
    if($t['pos']) return $t;
    }
    $returnArr["pos"] = $pos;
    $returnArr["url"] = $keywords[$article{$i}]['val'];
    return $returnArr;
    }
    if(!isset($keywords[$article{$i}]))
    {
    return $returnArr;
    }
    $keywords=$keywords[$article{$i}];
    return find($article,$keywords,$i+1,$pos+1);
    }
    $g_keywords = array("中国"=>"http://中国","中国人"=>"http://中国人","成功了"=>"http://成功了");
    $article = "中国中国人你好吗?中国最强大,中国我要成功了。";
    $keywords = inIt($g_keywords );
    replace($article,$keywords)
      

  3.   

    谢谢唠叨叔叔的回答,已经搞定,实践证明,
    这种替换方法比str_replace,这种,在一万关键字的情况下,文章长度一样,速度如下:我的时间:0.22426700592041
    它的时间:8.388111114502