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);