gpt4 book ai didi

php - [a-z] 会匹配 PREG/PCRE 中的重音字符吗?

转载 作者:IT王子 更新时间:2023-10-29 00:11:52 26 4
gpt4 key购买 nike

我已经知道 PCRE(特别是 PHP 的实现)中的 \w 有时可以匹配一些非 ASCII 字符,具体取决于系统的区域设置,但是 [a-z] 呢? ?

我不这么认为,但我在 Drupal 的核心文件之一(includes/theme.inc,已简化)中注意到这些行:

// To avoid illegal characters in the class,
// we're removing everything disallowed. We are not using 'a-z' as that might leave
// in certain international characters (e.g. German umlauts).
$body_classes[] = preg_replace('![^abcdefghijklmnopqrstuvwxyz0-9-_]+!s', '', $class);

这是真的吗,还是有人将 [a-z]\w 混淆了?

最佳答案

长话短说:也许吧,取决于应用程序部署到的系统,取决于 PHP 是如何编译的,欢迎来到本地化和国际化的 CF。

底层 PCRE 引擎在确定“a-z”的含义时会考虑语言环境。在基于西类牙语的语言环境中,ñ 会被 a-z 捕获)。 a-z 的语义是“a 和 z 之间的所有字母,在西类牙语中 ñ 是一个单独的字母。”

但是,PHP 盲目地将字符串作为字节集合而不是 UTF 代码点集合来处理的方式意味着您会遇到 a-z 可能匹配重音字符的情况。考虑到 Drupal 部署到的不同系统的多样性,他们选择明确允许的字符而不是仅仅相信 a-z 做正确的事情是有道理的。

我还推测这个正则表达式的存在是由于提交了一份关于未过滤德语变音符号的错误报告的结果。

2014 年更新:根据 JimmiTh's answer below ,看起来(尽管有一些“令人困惑的非 pcre-core-developers”文档)[a-z] 只会匹配字符 abcdefghijklmnopqrstuvwxyz 众所周知的 99%的时间。也就是说 — 框架开发人员往往会对他们代码中的模糊性感到紧张,尤其是当代码依赖于 PHP 无法像您希望的那样优雅地处理的系统(特定于区域设置的字符串),并且开发人员无法控制服务器时。虽然匿名 Drupal 开发人员的评论是不正确的——这不是“让 [a-z]\w 混淆”的问题,而是 Drupal 开发人员不清楚/不确定PCRE 如何处理 [a-z],并选择更具体的 abcdefghijklmnopqrstuvwxyz 形式以确保他们想要的特定行为。

关于php - [a-z] 会匹配 PREG/PCRE 中的重音字符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1930487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com