1 回答
TA贡献1886条经验 获得超2个赞
发生此问题是因为它也匹配子字符串。为避免这种情况,您可以使用preg_replace()将所有模式(如 regex 格式的单词 from $searchArray)替换为您的$repl数组$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);
演示: https ://3v4l.org/2gved
更新#1:
此外,在方法定义中使用全局变量也很糟糕,尤其是在 OOP 上下文中。你的风格是程序性的,但我仍然建议$searchArray
作为额外参数传递,所以它就像一个完全可重复使用的片段。否则,我们将使其静态化,$searchArray
始终只使用全局。
更新#2:
\b
我们通过在字符串的两侧添加单词边界来对每个单词执行正则表达式匹配。
引用正则表达式教程
元字符 \b 是类似于插入符号和美元符号的锚。它匹配一个称为“单词边界”的位置。这个匹配是零长度的。
有资格作为单词边界的三个不同位置:
在字符串的第一个字符之前,如果第一个字符是单词字符。
在字符串的最后一个字符之后,如果最后一个字符是单词字符。
在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
- 1 回答
- 0 关注
- 95 浏览
添加回答
举报