PHP排除冲突

PHP exclude conflict

我有一个问题: 我有一系列要排除的词 (例子:黄黄table) 我用 str_replace 替换了带有标签的同一个词以排除,但我有一个问题:

我认为问题出在table中的单词顺序,当有冲突的单词时排除,但我无法提前手动排序,因为我不认识它们(这是填写的用户)

我该怎么做?

这是我的代码:

$text = "I want to exclude the Yellow table in php";

$excluded_words_wrappers = array('<span>', '</span>');
$excluded_words = array('table', 'Yellow table');

foreach ($excluded_words as $excluded_word) {
    $excluded_word = trim($excluded_word);
    $match = "{$excluded_words_wrappers[0]}{$excluded_word}{$excluded_words_wrappers[1]}";
    $text = str_replace($excluded_word, $match, $text);
}

echo $text;

/**
 - Example sentence: I want to exclude the Yellow table in php  
 - What i get with my code: I want to exclude the <span>yellow</span> table in
   php
 - What I want: I want to exclude the <span>Yellow table</span> in
   php
**/

按长度 (strlen($excluded_word)) 对排除的单词列表进行排序,这样较长的单词首先出现(索引 0),较短的单词最后出现。

因此,'yellow table'出现在'yellow'之前。您不关心 'blue' 不合适,只关心它出现在任何与之冲突的内容之后。例如:

  • table
  • 黄色
  • 黄色table
  • 蓝色
  • 蓝色table

将排序为:

  • 黄色table
  • 蓝色table
  • 黄色
  • table
  • 蓝色

当一个被排除的词包含另一个被排除的词时,就会出现您的问题。任何包含另一个排除词的排除词,就其本质而言,必须比包含的排除词长。例如,如果您要在 'yellow table' 之前处理 'yellow' 并将 'yellow' 更改为 'red'(或用 <span></span> 包装它),那么所有出现的 'yellow table' 将更改为 'red table'。但是如果你先处理较长的排除词,那么你会在 'yellow' 之前处理 'yellow table',你会得到你要找的结果。

在您的 foreach 语句之前发出排序命令。您可以将 usort() 与用户定义的比较函数一起使用。 usort syntax

使用preg_replace:

<?php
// first arg is text to replace on, all remaining arguments are words you wrap in a span *(except last true or 1 - that makes it case sesitive)*
function spanWords(...$args){
  $str = array_shift($args); $end = end($args);
  if($end === true || $end === 1){
    array_pop($args); $i = '/';
  }
  else{
    $i = '/i';
  }
  return preg_replace('/'.join('|', $args).$i, '<span>[=10=]</span>', $str);
}
echo spanWords('I want to exclude the Yellow table in php', 'yellow table');
?>