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');
?>
我有一个问题: 我有一系列要排除的词 (例子:黄黄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');
?>