在preg_replace和php中的类似单词有问题

时间:2017-02-07 20:55:34

标签: php preg-replace

我想搜索我的字符串并通过链接替换某些单词。 但我对类似的词有问题,例如"帮助"和#34;帮助我"。 我想链接"帮助我"不是"帮助"。 这是我的代码:

$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="$0">$0</a>', $text);

1 个答案:

答案 0 :(得分:2)

以下是动态方法:按降序排列数值长度,然后将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="$0">$0</a>', $text);

请参阅PHP demo

正则表达式看起来像~Help Me|Help~。您可能希望添加字边界(\b)(see demo)或类似(?<!\S)(?!\S)see demo)等内容,以便稍后匹配整个字词。< / p>