如果文本中的单词与Array
中的单词兼容,则添加class
。
$searchArray = array('settings all','print', 'sum', 'industry', ...); // total 50K words
function sanitize($string) {
global $searchArray;
$repl = array_map("dashReplace", $searchArray);
$string = str_replace($searchArray, $repl, $string);
return $string;
}
function dashReplace($str) {
return "<span class='txtOlg'>" . $str . "</span>";
}
echo sanitize($text);
结果:
Lorem Ipsum只是印刷和排版的伪文本,全部 行业。
HTML格式:
Lorem Ip<span class='txtOlg'>sum</span> is simply dummy text of the <span class='txtOlg'>print</span>ing and type<span class='txtOlg'>settings all</span> industry.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果单词中有匹配项,它会更改,但我不希望它更改。例如;
HTML格式:
Lorem Ipsum is simply dummy text of the printing and typesettings all <span class='txtOlg'>industry</span>.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果它与单个单词兼容,我需要怎么做才能对其进行更改? (不兼容单词)
答案 0 :(得分:0)
之所以出现此问题,是因为它也与子字符串匹配。为避免这种情况,可以使用$searchArray
上的$repl
数组作为主题,使用Configuring Fast Connection Failover for JDBC Clients替换所有模式(如$string
中正则表达式格式的单词)。>
<?php
$searchArray = array('settings all','print', 'sum', 'industry'); // total 50K words
function sanitize($string,$searchArray) {
$repl = array_map("dashReplace", $searchArray);
$pattern = array_map("insertWordBoundaries", $searchArray);
$string = preg_replace($pattern,$repl,$string);
return $string;
}
function dashReplace($str) {
return "<span class='txtOlg'>" . $str . "</span>";
}
function insertWordBoundaries($str){
return "/\b". preg_quote($str,"/") ."\b/";
}
$text = 'Lorem Ipsum is simply dummy text of the printing and typesettings all industry.';
echo sanitize($text,$searchArray);
演示: preg_replace()
更新#1:
此外,在方法定义内使用全局变量是不好的,尤其是在OOP上下文中。您的样式是程序性的,但我仍建议您将$searchArray
作为额外的参数传递,因此它就像是一个可完美重用的片段。否则,我们将始终只使用全局$searchArray
变为静态。
更新#2:
我们通过在字符串的两侧添加单词边界\b
对每个单词执行正则表达式匹配。
元字符\ b是锚号,如插入符号和美元符号。 它在称为“单词边界”的位置匹配。这场比赛 是零长度。
有三个不同的位置可以作为单词边界:
- 如果字符串中的第一个字符是单词字符,则在字符串的第一个字符之前。
- 如果字符串中的最后一个字符是单词字符,则在字符串的最后一个字符之后。
- 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。