【问题标题】:str_replace on whole wordsstr_replace 对整个单词
【发布时间】:2016-08-24 10:13:01
【问题描述】:
  • 我有很多arrays 包含很多单词。
  • 我想对文本中出现的这些词应用CSS 样式
  • 一个数组对应一种颜色
  • 我只想要整个单词

我有一个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);

【问题讨论】:

  • 请详细说明$result['avisits']$result['avis']$avis默认值。
  • 为什么你必须替换只是做递归循环并在生成输出之前替换单词或给出一个更好的例子输入是什么以及你期望替换什么

标签: php str-replace


【解决方案1】:

如果我理解正确,$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);

【讨论】:

    【解决方案2】:

    str_replace() 不够聪明,无法确定什么是“完整词”;你需要使用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);
    

    【讨论】:

    • $chaine = "cinglê à connacinglédo cingle cinglétecinglê cinglê tecinglé"; $arr9 = ['foo', 'cinglê', 'boo']; $arr10 = $arr9; for($i = 0; $i ".$arr9[$i]." "; $avis = preg_replace(sprintf('/\b%s\b/', preg_quote($arr10)), $arr9, $chaine);回声 $avis 。 '
      ';
    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2012-09-21
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多