请各位路过的老师,帮我完善一下这个算法,谢谢了。 本帖最后由 lovewangya 于 2011-09-23 13:10:28 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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); 谢谢老师的回答,但有两个算法问题,我刚才还是没办法解决:一: 中国人你好吗?中国最强大,中国我要成功了。(这句话会替换两个"[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) 谢谢唠叨叔叔的回答,已经搞定,实践证明,这种替换方法比str_replace,这种,在一万关键字的情况下,文章长度一样,速度如下:我的时间:0.22426700592041它的时间:8.388111114502 ZEND如何导入PHP文件夹项目? 快速关键字过滤如何实现? 看看你是不是也曾经这样啊 php snmp找作h3c交换机 OID 列表菜单传值 分页显示 PHP 中是否有让一个include语句失效的函数? 怎么计算两个时间的相差秒数?能用就立即给分! 怎么读取session的值??? 求问这是php的版本问题 ? 【急】php中执行使用了OpenCV库的程序 asp转php
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);
一:
中国人你好吗?中国最强大,中国我要成功了。(这句话会替换两个"[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)
这种替换方法比str_replace,这种,在一万关键字的情况下,文章长度一样,速度如下:我的时间:0.22426700592041
它的时间:8.388111114502