Сделать отрицательный взгляд без учета регистра

У меня есть следующее выражение:

$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)).*$/";

и как флаг, то есть «/ … / I»:

$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», как правильно указывают некоторые авторы. Исправлено сейчас.

2

Решение

Ваше первое регулярное выражение ^(?!.*?that).*$ не имеет никакого отношения к чувствительности к регистру, так как вы не используете какой-либо модификатор для нечувствительности к регистру.

Регулярное выражение соответствует первому и третьему предложению, потому что ваше регулярное выражение говорит, что не должен будь словом that (с учетом регистра здесь) в предложении, что верно для первого и третьего предложения (в третьем предложении у вас есть ТОТ который не такой как тот)

Чтобы соответствовать только первому предложению, вы можете использовать встроенный модификатор (?i) лайк

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

Увидеть here

Кстати, ваш /^(?!.*?that).*$/i регулярное выражение также правильно.

2

Другие решения

Вы были близки

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

Увидеть демо на regex101.com. По твоему выражению ((?-i)) вы включали модификатор от.

2