str_replace 整个单词

str_replace on whole words

我有一个 str_replace 的例子,它有效但不考虑整个单词。 $result['avisits']$result['avisPronoums']$result['avisWordsUser'] 是包含单词的字符串,在数据库中用 "\n" 分开。 $result['avis'] 是一个包含文本的字符串,我想在其中替换单词

$arr1 = explode("\n", $result['avisits']);
$arr2 = $arr1;
for($i = 0; $i < count($arr1); ++$i) {
    $arr1[$i] = "<font color='red'><u>".$arr1[$i]."</u></font>";
}

$avis = str_replace($arr2, $arr1, $result['avis']);

$arr3 = explode("\n", $result['avisPronoums']);
$arr4 = $arr3;
for($i = 0; $i < count($arr3); ++$i) {
    $arr3[$i] = "<span style='background:Yellow'>".$arr3[$i]."</span>";
}
$avis2 = str_replace($arr4, $arr3, $avis);

$arr5 = explode("\n", $result['avisWordsUser']);
$arr6 = $arr5;
for($i = 0; $i < count($arr5); ++$i) {
    $arr5[$i] = "<span style='background:GreenYellow'>".$arr5[$i]."</span>";
}

$avis3 = str_replace($arr6, $arr5, $avis2);

str_replace() 不够聪明,无法确定什么是或不是 "whole word";你需要使用 preg_replace():

$avis = preg_replace(sprintf('/\b%s\b/', preg_quote($arr2)), $arr1, $result['avis']);
// ...
$avis2 = preg_replace(sprintf('/\b%s\b/', preg_quote($arr4)), $arr3, $avis);
// ...
$avis3 = preg_replace(sprintf('/\b%s\b/', preg_quote($arr6)), $arr5, $avis2);

所以如果我没理解错的话$result['avis']你想要逐字格式化的字符串是什么?
您可以尝试使用 ' ' 展开您的文本,这会将它分成单词,然后逐字进行直接比较,然后将其内爆。

$avis = explode(' ', $result['avis']);
$cnt = count($avis); // Don't use count() in your for loops it is a huge perfomance hit
for($i=0; $i < $cnt; $i++){
    if(in_array($avis[$i], $arr1)){
         $avis[$i] = "<font color='red'><u>".$avis[$i]."</u></font>";
    }
    elseif(in_array($avis[$i], $arr3))...
    // Do the other replacements here
}
$avis = implode(' ', $avis);