【问题标题】:Which characters exactly match \s in PHP's PCREs?哪些字符与 PHP 的 PCRE 中的 \s 完全匹配?
【发布时间】:2013-11-18 15:05:13
【问题描述】:

manual page 对此保持沉默,尽管用户在其下方发表了评论,指出带有 ASCII 码的字符 0x090x0A0x0C0x0D0x20 ,即 TAB、LF、FF、CR 和 SPACE,被识别为“空白”,但没有给出来源。

如果 PCRE 与 Perl 兼容,显然,这可能不像this Perl documentation 中解释的那么简单。事实上,它可能会受到语言环境的影响,然后开始变得毛茸茸。

上下文是我正在尝试替换 preg_match 调用,该调用旨在检查仅包含空格的字符串。

【问题讨论】:

    标签: php pcre


    【解决方案1】:

    根据PHP docs

    空格字符为 HT (9)、LF (10)、VT (11)、FF (12)、CR (13) 和空格 (32)。请注意,此列表包括 VT 字符(代码 11)。这使得“空格”与 \s 不同,后者不包括 VT(为了 Perl 兼容性)。

    【讨论】:

    • 这又取自 pcre 文档:pcre.org/pcre.txt(ctrl-f 通用字符类型)。明确提到:如果“使用语言环境;”包含在 Perl 脚本中,\s 可能匹配 VT 字符。在 PCRE 中,它永远不会。
    【解决方案2】:

    来自the PCRE documentation

    在 PCRE 中,默认情况下,\d\D\s\S\w\W 仅识别 ASCII 字符,即使在 UTF 模式下也是如此。但是,这可以通过设置 PCRE_UCP 选项来更改。

    根据this StackOverflow answer,当使用u 修饰符时,PCRE_UCP 选项与PCRE_UTF8 一起设置。

    因此,如果您不使用u 修饰符,那么\s 将只会匹配ASCII 空白字符。如果你这样做,那么它确实会更复杂。

    【讨论】:

      猜你喜欢
      • 2021-09-26
      • 2016-11-08
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多