0

这两个正则表达式有什么区别?(使用php preg_match())

/^[0-9\x{06F0}-\x{06F9}]{1,}$/u

/^[0-9\x{06F0}-\x{06F9}\x]{1,}$/u

\x第二种模式中的最后一个是什么意思?

4

5 回答 5

4

它被解释为\x00(空字符),但几乎可以肯定它是由草率的编辑或复制和粘贴引起的错误。

于 2012-05-06T17:22:01.290 回答
1

http://www.regular-expressions.info/unicode.html

...因为 \x 本身不是有效的正则表达式令牌...

于 2012-05-06T17:26:14.207 回答
0

我认为第二种模式无效。

根据此页面http://www.regular-expressions.info/unicode.html, \x 仅在后跟 unicode 编号有用:

由于 \x 本身不是一个有效的正则表达式标记,\x{1234} 永远不会被混淆为匹配 \x 1234 次。

于 2012-05-06T17:27:22.693 回答
0

这很奇怪。unicode 字符的 PHP 表示法是 \x{}。在 perl 中,它是同样的事情。

但是 php 在正则表达式中有 //u 修饰符。我认为这意味着unicode。perl 中没有这样的修饰符。

在 perl 正则表达式中,\x## 被解析,其中 ## 需要表示一个 ascii 字符。如果它的 \x 或 \x#,它的非法十六进制数字被忽略的警告(因为它需要 2 个数字,不多不少)并且它只需要序列中的有效十六进制数字。如果您没有 \x 中的数字,则它使用 \0 ascii char 等。

但是,任何 \x{} 表示法都可以,并且 \x{0} 等价于 \x{}。并且 \x{0}-\x{ff} 被认为是 ascii,\x{100}- 被认为是 unicode。

因此,\x 是一个有效的十六进制/unicode 转义序列,但它本身是假定的十六进制并且不完整,可能不应该留给解析器默认机制。

于 2012-05-06T18:09:46.197 回答
0

据我所知,第二个\x实际上是一个无效字符。两种表达方式都有效吗?

于 2012-05-06T18:51:09.303 回答