Php 如何使substr\u replace匹配整个字符串

Php 如何使substr\u replace匹配整个字符串,php,Php,我正在为我的wordpress站点编写一个自动链接功能,我正在使用substr_replace查找关键字(通常很多),并用link替换它——当然,我是通过过滤帖子内容来完成的 但在某些情况下,假设有标题为“stackoverflow”和“overflow”的帖子,结果是一团糟,输出结果如下所示: <?php $titledb = array('经济管理','管理','others'); $content='经济管理是我们国的家的中心领导力,这是中文测度。'; $r

我正在为我的wordpress站点编写一个自动链接功能,我正在使用substr_replace查找关键字(通常很多),并用link替换它——当然,我是通过过滤帖子内容来完成的

但在某些情况下,假设有标题为“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;
  ?>
我们爱,这是一个测试。我们爱”>stackoverflow,这是一个测试
我想要的是:

 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”包含另一个标题“overflow”

因此,我的问题是如何使substr_replace作为一个整体使用标题“stackoverflow”,并且只替换一次?当然,“overflow”仍然需要在其他地方替换,而不是在它包含在另一个关键字中时


提前感谢。

为了防止搜索一个单词会开始替换您为其他单词注入的HTML代码,您可以使用临时占位符,并对这些占位符执行最终替换:

we love<a target="_blank" href="http://www.a.com/stackoverflow">stackoverflow</a>,this is a test。we love stack<a target="_blank" href="http://www.a.com/overflow">overflow</a>,this is a test。
$titledb=array('经济管理','管理','其他);;
//将数组从较长字符串排序为较小字符串,以确保
//替换较长的字符串优先:
usort($titledb,function($a,$b){returnstrlen($b)-strlen($a);});
$content='1经济管理是我们国的家的中心领导力。';
foreach($titledb作为$index=>$title){
$pos=strpos($content,$title);
如果($pos!==false){
//临时插入格式为“#number#”的占位符:
$content=substr#u replace($content,“#$index,$pos,strlen($title));
}
}
//现在用最终的超链接HTML代码替换占位符
$content=preg\u replace\u回调(“~#(\d+)#~u”,函数($match)use($titledb){
返回“”;
}(单位:$content);
echo$内容;

看到它在

$content上运行了
变量被重写了。它在哪里被重写了?@u_muldercan u请撤消你的否决票,我想保存一些声誉,谢谢:)@u_mulderThank you@trincot,但在这种情况下,当出现第二次“溢出”时“显示时,它也将被替换。好的,在我的答案中添加了替换项,仅替换第一次出现的情况。在简短的示例中,您的代码运行良好,但在实际情况下,它不会替换任何内容。请查看更新。奇怪。您对问题的更新现在包括SQL、wordpress API、,和代码段中未定义的函数。这使一个真正只与循环有关的问题变得过于复杂。请提供可以重现问题的
$titledb
$content
的值。$titledb是所有文章标题,它是一个数组。$titles foreached与前面的简短片段中的$titles非常相似,唯一的区别是现在有数千个$内容是文章内容,它也比前一篇$content“我们喜欢stackoverflow,这是对stackoverflow的溢出测试”稍长。这不是循环,而是用链接替换过滤文章内容($content)。
$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;