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

时间:2019-11-28 09:37:44

标签: php replace

如果文本中的单词与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>.
                                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

如果它与单个单词兼容,我需要怎么做才能对其进行更改? (不兼容单词)

1 个答案:

答案 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对每个单词执行正则表达式匹配。

引用https://3v4l.org/2gved

  

元字符\ b是锚号,如插入符号和美元符号。   它在称为“单词边界”的位置匹配。这场比赛   是零长度。

     

有三个不同的位置可以作为单词边界:

     
      
  • 如果字符串中的第一个字符是单词字符,则在字符串的第一个字符之前。
  •   
  • 如果字符串中的最后一个字符是单词字符,则在字符串的最后一个字符之后。
  •   
  • 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
  •