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

php中的preg_replace和类似单词有问题,php,preg-replace,Php,Preg Replace,我想搜索我的字符串并通过链接到某个页面替换一些单词。 但我对“帮助”和“帮助我”等类似的词有疑问。 我想链接“帮助我”而不是“帮助”。 这是我的代码: $text="Please Help Me Fix This Issue!"; $AllTags=[]; $AllTags[]='Help'; $AllTags[]='Help Me'; $tmp = array(); foreach($AllTags as $term){ $tmp[] = "/($term)/i

我想搜索我的字符串并通过链接到某个页面替换一些单词。 但我对“帮助”和“帮助我”等类似的词有疑问。 我想链接“帮助我”而不是“帮助”。 这是我的代码:

$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);
$text=“请帮助我解决此问题!”;
$AllTags=[];
$AllTags[]='Help';
$AllTags[]=“帮助我”;
$tmp=array();
foreach($AllTags作为$term){
$tmp[]=“/($term)/i”;
} 
echo preg_替换($tmp,,$text);

这里是一种动态方法:按值长度降序排列数组,然后
使用
|
内爆成基于交替的模式,以便首先匹配较长的部分(请记住,匹配的第一个分支会使正则表达式停止分析替代项,请参阅)

使用

$text=“请帮助我解决此问题!”;
$AllTags=[];
$AllTags[]='Help';
$AllTags[]=“帮助我”;
usort($AllTags,function($a,$b){
返回strlen($b)-strlen($a);
});
echo preg_replace(“~”.内爆(“|”,$AllTags)。“~”,“$text);


正则表达式看起来像。您可能需要添加单词边界(
\b
)()或类似于
(?和
(?!\S)
()以后只匹配整个单词。

这里有一种动态方法:按值长度降序排列数组,然后
使用
|
内爆成基于交替的模式,以便首先匹配较长的部分(请记住,左侧匹配的第一个分支使正则表达式停止分析替代项,请参见)

使用

$text=“请帮助我解决此问题!”;
$AllTags=[];
$AllTags[]='Help';
$AllTags[]=“帮助我”;
usort($AllTags,function($a,$b){
返回strlen($b)-strlen($a);
});
echo preg_replace(“~”.内爆(“|”,$AllTags)。“~”,“$text);


正则表达式看起来像。您可能需要添加单词边界(
\b
)()或类似
(?和
(?!\S)
()的环视框,以便以后只匹配整个单词。

如果您只想链接“Help me”,则不要包含“Help”在
AllTags
数组中。您是动态构建模式还是在设计时构建模式?请参阅不要使用带有
preg\u replace
的数组,因为它会对每个项目处理整个字符串一次(与以前替换的更改一起)。为此,您可以:1)按字符串大小(从大到小)对搜索的项目进行排序。2)构建一个包含所有已排序项的替换模式(使用
内爆(“|”,$AllTags)
)。3)使用此模式在一次过程中使用
preg\u replace
处理字符串。如果您只想链接“Help me”,那么不要将“Help”包含到
AllTags
数组中。您是在动态构建模式吗?还是在设计时?请参阅不要将数组与
preg_replace
一起使用,因为它会对每个项处理整个字符串一次(与以前的替换内容一起更改)。为此,您可以:1)按字符串大小(从大到小)对搜索的项目进行排序。2) 构建一个包含所有已排序项的替换模式(使用
内爆('|',$AllTags)
)。3) 使用此模式使用
preg\u replace
一次性处理字符串。您也可以使用以下命令来代替
usort
rsort($AllTags,SORT\u FLAG\u CASE | SORT\u string)@CasimiritHippolyte:是的,看起来我也会做这项工作。@WiktorStribiżew谢谢你的帮助。此解决方案解决了我的问题。您也可以使用:
rsort($AllTags,SORT_FLAG_CASE | SORT_STRING),而不是使用
usort
@CasimiritHippolyte:是的,看起来我也会做这项工作。@WiktorStribiżew谢谢你的帮助。这个解决方案解决了我的问题。
$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);