response.setContentType("text/html");
我正在为我的wordpress网站编写一个自动链接功能,我正在使用substr_replace来查找关键字(通常是很多)并用链接替换它 - 我这样做是通过过滤帖子内容当然
但是在某些情况下,假设有些帖子有“stackoverflow”和“overflow”这样的标题,结果就是一团糟,输出结果如下:
<?php
$titledb = array('经济管理','管理','others');
$content='经济管理是我们国的家的中心领导力,这是中文测度。';
$replace='<a target="_blank" href="http://www.a.com/$1">$1</a>';
foreach ($titledb as $title) {
$regex = "~\b(" . preg_quote($title) . ")\b~u";
$content = preg_replace($regex, $replace, $content, 1);
}
echo $content;
?>
我想要的是:
we love<a target="_blank" href="http://www.a.com/stackoverflow">stackoverflow</a>,this is a test。we love <a target="_blank" href="http://www.a.com/stack<a target=" _blank"="">overflow</a> ">stackoverflow,this is a test。
这只是一个测试。生产环境可能更复杂,就像我说有成千上万的标题需要找到关键字并用链接替换。所以我看到这些破碎的链接很多。当标题包含另一个标题时就会发生。类似标题'stackoverflow'包含另一个标题'溢出'。
所以我的问题是如何使substr_replace整个标题'stackoverflow'并且只替换一次?当然,'溢出'仍然需要在其他地方替换,而不是当它包含在另一个关键字中时。
提前谢谢。
答案 0 :(得分:1)
为了防止搜索单词将开始替换您已为其他单词注入的HTML代码,您可以使用临时占位符,并对这些占位符进行最终替换:
$titledb = array('经济管理','管理','others');
// sort the array from longer strings to smaller strings, to ensure that
// a replacement of a longer string gets precedence:
usort($titledb, function ($a,$b){ return strlen($b)-strlen($a); });
$content='经济管理是我们国的家的中心领导力。';
foreach ($titledb as $index => $title) {
$pos = strpos($content, $title);
if ($pos !== false) {
// temporarily insert a place holder in the format '#number#':
$content = substr_replace($content, "#$index#", $pos, strlen($title));
}
}
// Now replace the place holders with the final hyperlink HTML code
$content = preg_replace_callback("~#(\d+)#~u", function ($match) use ($titledb) {
return "<a target='_blank' href='http://www.a.com/{$titledb[$match[1]]}'>{$titledb[$match[1]]}</a>";
}, $content);
echo $content;
上查看它