substr_replace替换问题

code-is-poetry 2016-04-28 12:10:34
写了一个小程序,想把网站文章中出现的关键词自动加链接,并且当关键词出现多次时只替换一次,与是用到了strpos()及substr_replace实现了此功能,代码如下:
function keywords_autolink($content) {
$keywords=array(
'企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
'企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
'管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>',
'管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>',
'管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>',
'市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>',
'职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>'
);
$keys=array_keys($keywords);
foreach ($keys as $k) {
$pos=strpos($content, $k);
if ($pos !== false) {
// Nothing found
$length=strlen($k);
$content=substr_replace($content, $keywords[$k], $pos, $length);
//$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。
unset($k);//最后销毁一下哦。

}
}

return $content;

}
add_filter('the_content', 'keywords_autolink');


但现在的一个问题是,当同时出现两个需要替换的词时就会乱套,比如,企业管理书籍和企业管理同时出现了,即“企业管理书籍企业管理'”,那么这时候替换结果就成了:
<a href="http://www.12reads.cn/" title="<a target='_blank' title='企业管理' href='http://www.12reads.cn/'>企业管理</a>书籍" target="_blank">企业管理书籍</a>



请问这种问题如何解决呀?大概知道用排序法什么的,可是不太懂,还望前辈们指点下,谢谢了!
...全文
286 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
果酱很好吃 2016-04-28
  • 打赏
  • 举报
回复
看看你的$keywords 第一个 企业管理书籍 替换为 带连接的企业管理书籍 第一个 企业管理 也替换为 带连接的企业管理书籍 第二个 企业管理 没有替换 怎么不对了
code-is-poetry 2016-04-28
  • 打赏
  • 举报
回复
谢谢,上面是替换了一次,但企业管理书籍被替换了多次,并且企业管理没有被替换。
果酱很好吃 2016-04-28
  • 打赏
  • 举报
回复

function keywords_autolink($content) {
    $keywords=array(
            '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
            '企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
            '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>',
            '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>',
            '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>',
            '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>',
            '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>'
	);
	/*
    $keys=array_keys($keywords);
    foreach ($keys as $k) {
      $pos=strpos($content, $k);
      if ($pos !== false) {
			// Nothing found
			$length=strlen($k);
			$content=substr_replace($content, $keywords[$k], $pos, $length);
			//$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。
			unset($k);//最后销毁一下哦。
	 
		}
    } 
	*/
	$keys = array_keys($keywords);
	$tmpReplace = [];
	foreach($keys as $k=>$v){
		$tmpReplace[] = $tmp = '['.$k.']';
		$tmpfind = '/'.$v.'/';
		$content = preg_replace($tmpfind,$tmp,$content,1);
	}
	
	$content = str_replace($tmpReplace,array_values($keywords),$content);
        
	return $content;
   
}
echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');
code-is-poetry 2016-04-28
  • 打赏
  • 举报
回复
引用 1 楼 jam00 的回复:

function keywords_autolink($content) {
    $keywords=array(
            '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
            '企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
            '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>',
            '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>',
            '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>',
            '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>',
            '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>'
	);
	/*
    $keys=array_keys($keywords);
    foreach ($keys as $k) {
      $pos=strpos($content, $k);
      if ($pos !== false) {
			// Nothing found
			$length=strlen($k);
			$content=substr_replace($content, $keywords[$k], $pos, $length);
			//$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。
			unset($k);//最后销毁一下哦。
	 
		}
    } 
	*/
	$keys = array_keys($keywords);
	$tmpReplace = [];
	foreach($keys as $k=>$v){
		$tmpReplace[] = $tmp = '['.$k.']';
	}
	$content = str_replace($keys,$tmpReplace,$content);
	$content = str_replace($tmpReplace,array_values($keywords),$content);
	
	return $content;
   
}
echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');
谢谢,但这个不行啊,会多次替换。
果酱很好吃 2016-04-28
  • 打赏
  • 举报
回复

function keywords_autolink($content) {
    $keywords=array(
            '企业管理书籍' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
            '企业管理' => '<a target="_blank" title="企业管理书籍" href="http://www.12reads.cn/">企业管理书籍</a>',
            '管理学书籍' => '<a target="_blank" title="管理学书籍" href="http://www.12reads.cn/">管理学书籍</a>',
            '管理书籍' => '<a target="_blank" title="管理书籍" href="http://www.12reads.cn/">管理书籍</a>',
            '管理类书籍' => '<a target="_blank" title="管理类书籍" href="http://www.12reads.cn/">管理类书籍</a>',
            '市场营销' => '<a target="_blank" title="市场营销" href="http://www.12reads.cn/category/marketing">市场营销</a>',
            '职场' => '<a target="_blank" title="职场" href="http://www.12reads.cn/category/career">职场</a>'
	);
	/*
    $keys=array_keys($keywords);
    foreach ($keys as $k) {
      $pos=strpos($content, $k);
      if ($pos !== false) {
			// Nothing found
			$length=strlen($k);
			$content=substr_replace($content, $keywords[$k], $pos, $length);
			//$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。
			unset($k);//最后销毁一下哦。
	 
		}
    } 
	*/
	$keys = array_keys($keywords);
	$tmpReplace = [];
	foreach($keys as $k=>$v){
		$tmpReplace[] = $tmp = '['.$k.']';
	}
	$content = str_replace($keys,$tmpReplace,$content);
	$content = str_replace($tmpReplace,array_values($keywords),$content);
	
	return $content;
   
}
echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');
code-is-poetry 2016-04-28
  • 打赏
  • 举报
回复
引用 5 楼 jam00 的回复:
看看你的$keywords 第一个 企业管理书籍 替换为 带连接的企业管理书籍 第一个 企业管理 也替换为 带连接的企业管理书籍 第二个 企业管理 没有替换 怎么不对了
我看错了,代码正常,谢谢,本贴已结,可不可以再看看这个http://bbs.csdn.net/topics/391942890

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧