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

标签 php regex ascii pcre

我已经知道 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/

相关文章:

php - 使用 FPDF 库生成 PDF 的问题

php - 在 PHP 中连接期间跳过空变量的函数

regex - MSBuild 社区任务 RegexReplace 从路径中删除尾部斜杠

javascript - 曾经是标签的通用正则表达式

django - Django 应用程序中/admin/处的 UnicodeEncodeError

android - TradeMark(TM) 标志在设备上显示为问号

php - 查询日期范围在一个范围内但特殊情况

php - 使用在 PHP 中连接的生物识别技术创建 Android 出勤监控应用程序

java - 正则表达式查找子字符串

c# - 带有 ASCII 值的 byte[] 到 string 到 int