substr_replace替换问题2

code-is-poetry code-is-poetry 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
感谢@jam00 在http://bbs.csdn.net/topics/391942653?page=1#post-401087159中的回答。

按照大神的思路,如果是下面的情况该怎么办呢?

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/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);//最后销毁一下哦。

}
}
//标签部分
$tags = get_tags();
foreach ($tags as $key){
$name= $key->name;//取出所有标签名称
$tag_link = get_tag_link($key->term_id);//取出标签链接
$replacement="<a target='_blank' title='{$key->name}' href='{$tag_link}'>{$key->name}</a>";
$pos=strpos($content, $name);
if ($pos !== false) {
$length=strlen($name);
//从标签开始出现的位置按照其字符长度开始替换,因此结果是只替换一次。
$content=substr_replace($content, $replacement, $pos, $length);
unset($key);//最后销毁一下哦。
}
}

return $content;

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


比原来的多一部分,这种情况和http://bbs.csdn.net/topics/391942653一模一样,比如有个标签叫“企业管理”,那么当文章中出现了“企业管理书籍”,就会被替换两次先替换企业管理书籍然后再替换企业管理,这样HTML乱了套,变成下面这样:

<a href="http://www.12reads.cn/" title="<a target='_blank' title='企业管理' href='http://v:8888/tag/%e4%bc%81%e4%b8%9a%e7%ae%a1%e7%90%86'>企业管理</a>书籍" target="_blank">企业管理书籍</a>
...全文

相关推荐

评论 15
收藏 已收藏
分享
返回顶部
code-is-poetry
基础编程 21,889 成员 140,329 内容