为了账号安全,请及时绑定邮箱和手机立即绑定

仅在与单个单词兼容时更改

仅在与单个单词兼容时更改

PHP
慕仙森 2022-05-27 16:14:33
如果文本中的单词与 中的单词兼容Array,则单词正在class添加。$searchArray = array('settings all','print', 'sum', 'industry', ...); // total 50K wordsfunction 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>.                                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^如果它与单个单词兼容,我需要做什么来更改它?(不兼容单词)
查看完整描述

1 回答

?
MM们

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 是类似于插入符号和美元符号的锚。它匹配一个称为“单词边界”的位置。这个匹配是零长度的。

有资格作为单词边界的三个不同位置:

  • 在字符串的第一个字符之前,如果第一个字符是单词字符。

  • 在字符串的最后一个字符之后,如果最后一个字符是单词字符。

  • 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。


查看完整回答
反对 回复 2022-05-27
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信