使用unicode,PHP正确的正则表达式在PHP 5.3.3-7中不起作用

时间:2014-06-14 09:40:29

标签: php regex unicode utf-8 pcre

我正试图让这个正则表达式用于查找句子中的两个单词。

echo (int)preg_match('/\bHello\W+(?:\w+\W+){0,6}?World\b/ui', 'Hello, world!', $matches).PHP_EOL;
print_r($matches);

它完美无缺:

1
Array
(
    [0] => Hello, world
)

...但只有拉丁语。如果我切换到unicode,它找不到任何东西。也没有必要查看语法,因为它来自a book(第8章“找到彼此接近的两个单词”)。问题是它只适用于拉丁语单词,但不适用于像这样的unicode字符串:'Привіт,світу!' (乌克兰语)。

我检查了几乎所有可能出现的问题:

✓我正在使用正则表达式中的'u'标志。

✓我在执行此语句之前在代码中启用了UTF-8支持,如下所示:

 ini_set('default_charset', 'UTF-8');
 mb_internal_encoding('UTF-8');
 mb_regex_encoding('UTF-8');

✓我在Debian Linux上的PCRE编译正确:

 # pcretest -C
 PCRE version 8.02 2010-03-19
 Compiled with
   UTF-8 support
   Unicode properties support
   Newline sequence is LF
   \R matches all Unicode newlines
   Internal link size = 2
   POSIX malloc threshold = 10
   Default match limit = 10000000
   Default recursion depth limit = 10000000
   Match recursion uses stack

✓我甚至尝试将这个奇怪的序列(* UTF8)添加到模式according to this answer,但它没有帮助:

echo (int)preg_match('/(*UTF8)\bПривіт\W+(?:\w+\W+){0,6}?світу\b/ui', 'Привіт, світу!', $matches).PHP_EOL;
print_r($matches);

结果:

0
Array
(
)

所以我的问题是:当unicode完全适用于我在同一代码中使用的其他unicode模式时,为什么unicode不能在这里工作?它们有点简单,如下:

echo (int)preg_match('/Привіт/ui', 'Привіт, світу!', $matches).PHP_EOL;
print_r($matches);

令人惊讶的是:

1
Array
(
    [0] => Привіт
)

最后有趣的是它在online regex tester完全正常工作(这就是为什么我实际上非常沮丧,我测试了它然后期望在我的代码中工作,但事实并非如此)。

噢明智的Stackoverflow,请给他一个提示。

1 个答案:

答案 0 :(得分:1)

我曾遇到过类似的问题,并发现模式中的UTF-8符号在某些版本的PHP上无效。甚至当时的5.3版也有这个问题。在这里查看您的示例:http://3v4l.org/7HurJ。根据该测试,您必须至少有5.3.4才能使该模式有效,但我认为,版本号在这里并没有多大意义。也许,它实际上取决于一些编译选项,或者可能有一个解决方法,但我没有深入挖掘,只是简单地调整我的方法,不要在表达式中使用任何“有趣”的符号。