str_replace 整个单词
str_replace on whole words
- 我有很多
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);
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);
- 我有很多
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);
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);