对案例不敏感做出否定的前瞻性

时间:2017-06-10 16:34:04

标签: php regex pcre case-insensitive negative-lookahead

我有以下表达式:

$exp = "/^(?!.*?that).*$/";

用于匹配任何不包含""。

的行

我有以下三句话:

$str = array(   
   "I like this sentence.", #line1
   "I like that sentence.", #line2
   "I link THAT sentence."  #line3
);

匹配区分大小写,因此只匹配第1行和第3行。到目前为止一切都很好。

但是,我想让它不区分大小写,所以它只匹配第1行。我尝试使用内联修饰符,即&#34;(? - i ...)&#34;:< / p>

$exp = "/^(?!.*?(?i:that)).*$/";

并作为旗帜,即&#34; / ... / i&#34;:

$exp = "/^(?!.*?that).*$/i";

但无济于事。

我使用以下循环运行搜索:

foreach($str as $s) {
    preg_match_all($exp, $s, $matches); 
    var_dump($matches);
}

带输出:

array (size=1)
  0 => 
    array (size=1)
      0 => string 'I like this sentence.' (length=21)
array (size=1)
  0 => 
    array (size=0)
      empty
array (size=1)
  0 => 
    array (size=1)
      0 => string 'I link THAT sentence.' (length=21)

此处提供在线演示:https://regex101.com/r/bs9rzF/1

我很感激有关如何使我的正则表达式不区分大小写的提示。

编辑:我错误地使用&#34;? - 我&#34;而不是&#34;? - i&#34;,正如一些贡献者正确指出的那样。现在修好了。

2 个答案:

答案 0 :(得分:2)

您的第一个正则表达式^(?!.*?that).*$与区分大小写无关,因为您没有使用任何修饰符来区分大小写。

正则表达式匹配第一句和第三句,因为你的正则表达式是说不应该成为单词that区分大小写)句子,对于第一句和第三句都是正确的(在第三句中你有那个,这与 不一样)

要仅匹配第一个句子,您可以使用内联修饰符(?i),如

(?i)^(?!.*?that).*$

参见 here

顺便说一句,你的/^(?!.*?that).*$/i正则表达式也是正确的。

答案 1 :(得分:2)

你很亲密:

^(?!.*?(?i)that).*$

a demo on regex101.com。在您的表达式((?-i))中,您将修改器关闭