preg_replace 和 php 中的相似词有问题

having issue with preg_replace and similar words in php

我想搜索我的字符串并用 link 替换一些单词到某个页面。 但我对类似 "Help" 和 "Help Me" 这样的词有疑问。 我想要 link "Help Me" 而不是 "Help"。 这是我的代码:

$text="Please Help Me Fix This Issue!";
$AllTags=[];
$AllTags[]='Help';
$AllTags[]='Help Me';
    $tmp = array();
    foreach($AllTags as $term){
        $tmp[] = "/($term)/i";
    } 
echo preg_replace($tmp, '<a href="[=12=]">[=12=]</a>', $text);

这是动态方法:按值长度降序排列数组,然后 implode| 进入基于交替的模式,以便首先匹配较长的部分(记住从左边开始匹配的第一个分支使正则表达式停止分析备选方案,请参阅 Remember That The Regex Engine Is Eager)。

使用

$text="Please Help Me Fix This Issue!";
$AllTags=[];
$AllTags[]='Help';
$AllTags[]='Help Me';
usort($AllTags, function($a, $b) {
    return strlen($b) - strlen($a);
});
echo preg_replace('~' . implode('|', $AllTags) . '~', '<a href="[=10=]">[=10=]</a>', $text);

参见PHP demo

正则表达式看起来像 ~Help Me|Help~. You might want to add word boundaries (\b) (see demo) or lookarounds like (?<!\S) and (?!\S) (see demo) 以后只匹配整个单词。