2017-06-10 25 views
2

我有以下表现:做一个负向前查找不区分大小写

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

这是为了匹配不包含“”任何线。

我有以下三个句子:

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

匹配是大小写敏感的,因此仅线1和3是匹配的。到现在为止还挺好。

不过,我想,使其不区分大小写的,所以它仅匹配线1.我有一个内嵌修改,即“(-i ...?)”的尝试:

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

,并作为一个标志,即 “/ ...... /我”:

$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

我会感谢任何提示我如何使我的正则表达式不区分大小写。

编辑:我错误地使用“?-i”而不是“?-i”,正如一些贡献者正确指出的那样。现在修复。

+1

'$ exp =“/^(?!.*?that)。* $/i”;'是正确的,应该工作。但是'(?-i:...'关掉了我的修饰符。要打开它:'(?i:...' –

+1

第二次尝试使用'$ exp =“/^(?!.*?that )。* $/i“;'[**应该工作。**](https://3v4l.org/sEXhn) – revo

+0

的确,看起来这个问题使搜索区分大小写而不管我的修饰符是在什么地方否则:u标志对于带有口音和其他字母的语言也是必需的,即''/^(?!.*?that)。* $/ui“'感谢您的快速回答! – msoutopico

回答

2

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

正则表达式匹配的第一和第三句,因为你的正则表达式是说有应该在句子中,这是第一和第三句真字that区分大小写这里)(在第三句你有THAT这是不一样的

只匹配了第一句话,你可以使用内联修改(?i)

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

here

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

2

你接近:

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

a demo on regex101.com。在你的表情((?-i))中,你正在将修改器关闭