现在有个需求:给文中的关键字加超链接
1、如果有10个相同的关键字,只替换第一个
2、如果某关键字A包含另外一个关键字B,则替换关键字B的时候不可替换A中的关键字B我如下做的,不知道谁有没有好的办法?
<?php
$arrKeywords = array (
0 => array (
0 => '镀锌板卷',
1 => 'http://www.woosteel.com/block/duxinbanjuan'
),
1 => array (
0 => '锌',
1 => 'http://www.woosteel.com/block/xin'
),
2 => array (
0 => '上海',
1 => 'http://www.woosteel.com/shanghai'
),
3 => array (
0 => '叉烧包',
1 => 'http://www.woosteel.com/block/chashaobao'
)
);
$content = "2011年-上海-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少-叉烧包-?2011年-上海-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少-叉烧包-?";
$content = ReplaceKeywords($content);
echo($content);


/*内容关键字替换**/
function ReplaceKeywords($content)
{
global $arrKeywords;
if ( empty($content) )
{
return($content);
}
$i = 0;
foreach( $arrKeywords as $arr )//遍历关键字
{
if ( strpos($content, $arr[0]) > -1 )//如果找到,则替换为:[Keyword0]、[Keyword1]这种格式的数据,并将找到的关键字放入新的数组
{
$content = preg_replace("/" . $arr[0] . "/i", "[Keyword" . $i . "]", $content);
$arrTemp[] = $arr;
$i ++;
}
}
//die($content);//可以在这里先输出替换后的结果
//再将替换后的数据反替换
$arrLen = count($arrTemp);
for ( $i = 0; $i < $arrLen; $i ++ )//遍历找到的关键字,比如有10个[Keyword0],替换的时候第一个带链接,其余都不带。
{
$content = preg_replace("/\[Keyword" . $i . "\]/i", "<strong><a href=\"" . $arrTemp[$i][1] . "\" target=\"_blank\">" . $arrTemp[$i][0] . "</a></strong>", $content, 1);
$content = preg_replace("/\[Keyword" . $i . "\]/i", $arrTemp[$i][0], $content);
}
return ($content);
}
?>

解决方案 »

  1.   

    思路不错,代码大有改进之处
    /*内容关键字替换**/
    function ReplaceKeywords($content) {
      global $arrKeywords;
      if ( empty($content) ) return($content);  foreach($arrKeywords as $k=>$v) {
        $p[$k] = "/$v[0]/";
        $r[$k] = "__STACK_{$k}__";
      }
      $content = preg_replace($p, $r, $content, 1); //既然是多个相同的只替换一次,应在一开始完成  foreach($arrKeywords as $k=>$v) {
        $p[$k] = "/{$r[$k]}/";
        $r[$k] = "<strong><a href='$v[1]'>$v[0]</a></strong>";
      }
      return preg_replace($p, $r, $content);
    }
      

  2.   

    一楼代码写的真好啊!
    通过对比,可以看出foreach和preg_replace这两个函数我都没有活用,学习了。然后有个小bug,就是如果我把$content写成:
    $content = "2011年-上海-镀锌板卷-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少-叉烧包-?2011年-上海-镀锌板卷-和-锌-的价格分别是多少?2011年-上海-镀锌板卷-和-锌-的价格分别是多少-叉烧包-?";
    我的第二个需求:2、如果某关键字A包含另外一个关键字B,则替换关键字B的时候不可替换A中的关键字B
    就不能满足了。