PHP регулярное выражение нечувствительно к кириллице

Я использую preg_replace и preg_match с PHP, работая в этой кодировке: кириллическая Windows 1251. Я пытаюсь preg_replace используя preg_replace регистра.

Я сделал эти тесты:

$pattern = '/myCyrillicWord1|myCyrillicWord2/i';
$subject = 'Am I able to find MYCyrILlicWord1?';
$res = preg_replace($pattern, 'matched', $subject);

На UTF-8:

С модификатором utf-8 в шаблоне:

$pattern = '/myCyrillicWord1|myCyrillicWord2/iu';
$output = 'Am I able to find matched or not';

Без:

$pattern = '/myCyrillicWord1|myCyrillicWord2/i';
$output = 'Am I able to find MYCyrILlicWord1 or not';

В Windows 1251:

$pattern = '/myCyrillicWord1|myCyrillicWord2/i';
$output = 'Am I able to find MYCyrILlicWord1 or not';

Регулярное выражение является функциональным на utf-8, но не на Windows 1251. Обратите внимание, что я тестировал с символами кириллицы, такими как "х" и "Х" (которые выглядят как латинские буквы "х" и "Х").

Мой вопрос - знать, нормально ли это поведение?

Как я могу сопоставить свои слова кириллицы в кодировке Windows 1251 с модификатором без учета регистра?

Большое спасибо.

1 ответ

Я не думаю, что PCRE поддерживает кодировки, поэтому ваши варианты в основном

  • конвертировать все в utf8, обрабатывать, а затем конвертировать назад или
  • используйте вручную созданные регулярные выражения для нечувствительности к регистру, например /[Дд][Ыы][Кк]/ для соответствия Дык, дыК т.д.

licensed under cc by-sa 3.0 with attribution.