我有下面的代码可以删除包含任何模式的整个单词
$patterns = ["are", "finite", "get", "er"];
$string = "You are definitely getting better today";
$re = '\S*('.implode('|', $patterns).')\S*';
$string = preg_replace('#'.$re.'#', '', $string);
$string = preg_replace('#\h{2,}#', ' ', $string);
echo $string;
以上代码的输出为
You today
我想将此代码分成两个函数,以便第一个函数仅删除模式中存在的整个单词,第二个函数仅删除包含任何模式的单词。
我希望仅删除整个单词的功能一的输出
You definitely getting better today (**are** is removed)
以及另一个函数的输出,该函数将删除包含模式的整个单词
You are today (**definitely getting better** are removed)
答案 0 :(得分:2)
第一部分很基本:仅匹配整个关键字(实际上,您可以找到数十个这样的问答集,例如this)
\b(?:are|finite|get|er)\b
可以将以下代码应用于您的代码:$re = '\b('.implode('|', $patterns).')\b';
第二部分涉及更多:在不断扩展子字符串匹配以匹配整个单词的同时,您要排除与整个关键字匹配的单词。
我们可以像这样先行实现:
(?!\b(?:are|finite|get|er)\b)\S*(?:are|finite|get|er)\S*
$patterns = ["are", "finite", "get", "er"];
$string = "You are definitely getting better today";
$alternations = ''.implode('|', $patterns);
$re = '(?!\b(?:'.$alternations.')\b)\S*(?:'.$alternations.')\S*';
$string = preg_replace('#'.$re.'#', '', $string);
如果\ b不适用于您,并且您想使用空格作为单词边界,请使用lookarounds:
(?<=\s)(?:are|finite|get|er)(?=\s)
Sample Code(更新)案例1。