加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 22:52:48 所属栏目:PHP教程 来源:网络整理
导读:我正在尝试将这个正则表达式用于查找句子中的两个单词. echo (int)preg_match('/bHelloW+(?:w+W+){0,6}?Worldb/ui','Hello,world!',$matches).PHP_EOL;print_r($matches); 它完美地运作: 1Array( [0] = Hello,world) ……但只有拉丁语.如果我切换到uni
我正在尝试将这个正则表达式用于查找句子中的两个单词.

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中,但它没有帮助:

06004

结果:

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才能使用这个模式,但我认为,版本号在这里并没有多大意义.也许,它实际上取决于一些编译选项,或者可能有一个解决方法,但我没有深入挖掘并简单地调整我的方法不在表达式中使用任何“有趣”的符号.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读