У меня есть следующее выражение:
$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», как правильно указывают некоторые авторы. Исправлено сейчас.
Ваше первое регулярное выражение ^(?!.*?that).*$
не имеет никакого отношения к чувствительности к регистру, так как вы не используете какой-либо модификатор для нечувствительности к регистру.
Регулярное выражение соответствует первому и третьему предложению, потому что ваше регулярное выражение говорит, что не должен будь словом that
(с учетом регистра здесь) в предложении, что верно для первого и третьего предложения (в третьем предложении у вас есть ТОТ который не такой как тот)
Чтобы соответствовать только первому предложению, вы можете использовать встроенный модификатор (?i)
лайк
(?i)^(?!.*?that).*$
Увидеть here
Кстати, ваш /^(?!.*?that).*$/i
регулярное выражение также правильно.
Вы были близки
^(?!.*?(?i)that).*$
Увидеть демо на regex101.com. По твоему выражению ((?-i)
) вы включали модификатор от.