【问题标题】:PHP regex case-insensitive on cyrillic charset西里尔字符集上的 PHP 正则表达式不区分大小写
【发布时间】:2014-05-20 15:22:44
【问题描述】:

我在 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 字符集中的西里尔字母与不区分大小写的修饰符匹配?

非常感谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 确实没有。所以,你是对的,因为这两个变体看起来就是答案。
    • 好的,非常感谢您的回答。我选择了第二种变体,因为它太重了,无法将整个页面转换为 utf-8 并转换回其原始编码。暂时没关系,因为我有大约十个字要检查。如果我有数百个单词要检查,我会感到失望,在这种情况下,这个解决方案将不适合。
    猜你喜欢
    • 2011-07-24
    • 2011-04-22
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多