如何使substr_replace匹配整个字符串

时间:2017-01-28 10:33:02

标签: php

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'并且只替换一次?当然,'溢出'仍然需要在其他地方替换,而不是当它包含在另一个关键字中时。

提前谢谢。

1 个答案:

答案 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;

eval.in

上查看它