Php 将正则表达式拆分为两个正则表达式:仅限整词&;带子字符串的单词仅匹配

Php 将正则表达式拆分为两个正则表达式:仅限整词&;带子字符串的单词仅匹配,php,regex,Php,Regex,下面的代码删除了包含任何模式的所有单词 $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,}#', '

下面的代码删除了包含任何模式的所有单词

$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)

第一部分是基本的:只匹配整个关键词(实际上,你可以找到几十个这样的Q&A,例如)

它可以像这样应用于您的代码:
$re='\b('.introde('|',$patterns)。'\b'

第二部分更为复杂:当您不断扩展子字符串匹配以匹配整个单词时,您希望排除匹配整个关键字的单词。
我们可以使用前瞻来实现以下目标:

(?!\b(?:are|finite|get|er)\b)\S*(?:are|finite|get|er)\S*
,, :


如果\b不适合您,并且您希望使用空格作为单词边界,请使用:


(?非常感谢@wp78de
(?!\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);
(?<=\s)(?:are|finite|get|er)(?=\s)