首页 > 解决方案 > 修改我的正则表达式,以便模式搜索不区分大小写

问题描述

我有以下 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. 如果$string中删除的单词前后有换行符,则只应删除一个换行符。

如果$string

You are definitely getting
better
today

输出必须是

You definitely
today

示例 PHP 代码

问候,

标签: phpregex

解决方案


您可以使用

$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 演示

虽然i修饰符为正则表达式匹配提供了不区分大小写的功能,但这里另一个不太明显的事情是您需要添加一个可选的换行符模式

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

在它后面加上一个?量词,你可以让它匹配 1 次或 0 次,即让它成为可选的,这样整个模式仍然可以匹配到字符串的开头。


推荐阅读