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