PHP正确的正则表达式在带有unicode的PHP 5.3.3-7中不起作用
我正在尝试将这个正则表达式用于查找句子中的两个单词.
echo (int)preg_match('/bHelloW+(?:w+W+){0,6}?Worldb/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中,但它没有帮助:
结果: 0 Array ( ) 所以我的问题是:为什么unicode不能在这里工作,因为它完全适用于我在同一代码中使用的其他unicode模式?它们有点简单,像这样: echo (int)preg_match('/Прив?т/ui','Прив?т,св?ту!',$matches).PHP_EOL; print_r($matches); 这令人惊讶的工作: 1 Array ( [0] => Прив?т ) 最后很有趣它在online regex tester完全正常(这就是为什么我实际上非常沮丧,我测试了它然后期望在我的代码中工作,但它没有). 哦明智的Stackoverflow,请给他一个提示. 解决方法
我有一个类似的问题,发现模式中的UTF-8符号不适用于某些版本的PHP.甚至当时的5.3版也有这个问题.在这里查看你的例子:
http://3v4l.org/7HurJ.根据那个测试,你必须至少有5.3.4才能使用这个模式,但我认为,版本号在这里并没有多大意义.也许,它实际上取决于一些编译选项,或者可能有一个解决方法,但我没有深入挖掘并简单地调整我的方法不在表达式中使用任何“有趣”的符号.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |