PHP regex нечувствителен к регистру на кириллической кодировке

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

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

$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. Обратите внимание, что я тестировал символы кириллицы, такие как «х» и «Х» (которые выглядят как латинские буквы «x» и «X»).

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

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

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


person KevinNTH    schedule 20.05.2014    source источник


Ответы (1)


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

  • преобразовать все в utf8, обработать, а затем преобразовать обратно, или
  • используйте созданные вручную регулярные выражения для нечувствительности к регистру, например /[Дд][Ыы][Кк]/ для соответствия Дык, дыК и т. д.
person georg    schedule 20.05.2014
comment
На самом деле это не так. Итак, вы правы, поскольку эти два варианта выглядят как ответ. - person Wladyslaw Brodsky; 21.05.2014
comment
Хорошо, большое спасибо за ответ. Я выбрал второй вариант, потому что он слишком тяжел, чтобы преобразовать всю страницу в utf-8 и преобразовать обратно в исходную кодировку. На данный момент это нормально, так как мне нужно проверить около десяти слов. Я был бы разочарован, если бы мне пришлось проверить сотни слов, и в этом случае это решение не подошло бы. - person KevinNTH; 21.05.2014