PHP正则表达式对西里尔字符集不区分大小写

时间:2014-05-20 15:22:45

标签: php regex character-encoding case-insensitive cyrillic

我在PHP中使用preg_replacepreg_match,在这个字符集中工作:Cyrillic 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字符集中的西里尔字母与不区分大小写的修饰符进行匹配?

非常感谢。

1 个答案:

答案 0 :(得分:2)

我不认为PCRE支持字符集,所以你的选择基本上是

  • 将所有内容转换为utf8,处理然后转换回来,或
  • 使用手动制作的正则表达式不区分大小写,例如/[Дд][Ыы][Кк]/以匹配ДыкдыК