修改我的正则表达式,以使模式搜索不区分大小写

时间:2018-07-23 05:04:15

标签: php regex

我有以下php代码,可删除与模式匹配的整个单词

$patterns = ["re", "get", "ER"];
$string = "You are definitely getting better today";
$alternations = implode('|', $patterns);
$re = '(?!(?<=\s)(?:'.$alternations.')(?=\s))\S*(?:'.$alternations.')\S*';
$string = preg_replace('#'.$re.'#', '', $string);
$string = preg_replace('#\h{2,}#', ' ', $string);
echo $string;

我想要两个修改

  1. 模式搜索不应区分大小写,例如模式 ER 必须删除 $ string
  2. 中的更好
  3. 如果在 $ string 中删除的单词前后有换行符,则仅应删除一个换行符。

如果 $ string

You are definitely getting
better
today

输出必须为

You definitely
today

Sample PHP Code

此致

1 个答案:

答案 0 :(得分:1)

您可以使用

$patterns = ["re", "get", "ER"];
$string = "You are definitely getting\nbetter\ntoday";
$alternations = implode('|', $patterns);
$re = '\R?(?!(?<=\s)(?:'.$alternations.')(?=\s))\S*(?:'.$alternations.')\S*';
$string = preg_replace('#'.$re.'#i', '', $string);
$string = preg_replace('#\h{2,}#', ' ', $string);
echo $string;

请参见PHP demo

虽然i修饰符对正则表达式匹配不区分大小写,但在这里,另一个不那么明显的事情是,您需要添加可选的换行模式

该换行符可以通过多种方式进行匹配,但是在PHP PCRE中,您可以轻松地将其与\R构造进行匹配。

在其后添加?量词,可以使其匹配1或0次,即使其成为可选值,以便整个模式仍可以在字符串的开头进行匹配。