将正则表达式分成两个正则表达式:仅整个单词和带有子字符串的单词仅匹配

时间:2018-07-18 05:32:08

标签: 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,}#', ' ', $string);
echo $string;

以上代码的输出为

You today

我想将此代码分成两个函数,以便第一个函数仅删除模式中存在的整个单词,第二个函数仅删除包含任何模式的单词。

我希望仅删除整个单词的功能一的输出

You definitely getting better today (**are** is removed)

以及另一个函数的输出,该函数将删除包含模式的整个单词

You are today (**definitely getting better** are removed)

1 个答案:

答案 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*

DemoSample Code

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