【发布时间】:2015-03-10 16:19:06
【问题描述】:
PHP 中转义序列 \s 匹配的完整字符列表是什么? 一些正则表达式风格在此转义序列中包含垂直空格和其他字符。
【问题讨论】:
PHP 中转义序列 \s 匹配的完整字符列表是什么? 一些正则表达式风格在此转义序列中包含垂直空格和其他字符。
【问题讨论】:
来自pcrepattern specifications页面:
通用字符类型
\s any white space character为了与 Perl 兼容,\s 没有用来匹配 VT 字符 (代码 11),这使它与 POSIX “空间”类不同。 然而,Perl 在 5.18 版本中添加了 VT,PCRE 在 发布 8.34。默认的 \s 字符现在是 HT (9)、LF (10)、VT (11)、FF(12)、CR(13)和空格(32),定义为白色 “C”语言环境中的空格。如果特定于语言环境,此列表可能会有所不同 匹配正在发生。例如,在某些语言环境中 “不间断空格”字符 (\xA0) 被识别为空格, 而在其他情况下,VT 字符不是。
所以\s 将匹配 5 个字符以及更多字符,具体取决于:
This test 比较不同 PHP 版本的 preg_match 的结果。
【讨论】:
PHP 有 \h 仅用于水平空白字符:http://www.php.net/manual/en/regexp.reference.escape.php
根据http://www.pcre.org/pcre.txt:
为了与 Perl 兼容,\s 不匹配 VT 字符(代码 11)。这使它与 POSIX “空间”类不同。 \s 字符是 HT (9)、LF (10)、FF (12)、CR (13) 和空格 (32)。如果 “使用语言环境;”包含在 Perl 脚本中,\s 可能匹配 VT 字符 三。在 PCRE 中,它永远不会。
所以如果“垂直空格”是指垂直制表符,答案是否定的。
序列 \h、\H、\v 和 \V 是添加到 Perl 的功能 在 5.10 版中。与其他仅匹配的序列相反 默认情况下 ASCII 字符,这些总是匹配某些高值 UTF-8 模式下的代码点,无论是否设置了 PCRE_UCP。 水平空格字符为: U+0009 水平制表符 U+0020 空格 U+00A0 不间断空格 U+1680 欧格姆空格标记 U+180E 蒙古语元音分隔符 U+2000 恩四边形 U+2001 Em 四边形 U+2002 恩空间 U+2003 Em 空间 U+2004 每 em 三个空间 U+2005 四个每 em 空间 U+2006 六人制空间 U+2007 图空间 U+2008 标点空格 U+2009 薄空间 U+200A 头发空间 U+202F 狭窄的不间断空间 U+205F 中等数学空间 U+3000 表意空间 垂直空格字符是: U+000A 换行 U+000B 垂直制表符 U+000C 换页 U+000D 回车 U+0085 下一行 U+2028 行分隔符 U+2029 段落分隔符【讨论】:
"The sequences \h, \H, \v, and \V"。 \h 可能更适合你,这取决于你的需要。
来自http://www.pcre.org/pcre.txt:
\s 任何与 \p{Z} 匹配的字符, 加HT、LF、FF、CR
【讨论】:
#ifdef PCRE_UCP。不应该依赖它。