PHP中的正则表达式返回preg_match():编译失败:PCRE不支持\ L,\ l,\ N {name},\ U或\ u

时间:2019-04-29 13:59:48

标签: php regex pcre

我正在尝试使用正则表达式检查PHP中的用户输入有效性,但是我只是不知道是什么。我的正则表达式有误

这是我的+process.env.SALT_ROUNDS声明:

if

\如果为true }

我遇到以下错误:

  

警告:preg_match():编译失败:PCRE在偏移量12处不支持\ L,\ l,\ N {name},\ U或\ u

1 个答案:

答案 0 :(得分:3)

“ PCRE”代表“与Perl兼容的正则表达式”,但这并不意味着Perl5正则表达式中的所有功能都在PCRE中可用。 PHP手册在PCRE: Differences from Perl上有一页,其中包含与错误消息中的语句相似的语句:

  

不支持以下Perl转义序列:\ l,\ u,\ L,\ U。实际上,这些是通过Perl的常规字符串处理实现的,而不是其模式匹配引擎的一部分。

PHP(自7.0起)确实有support for \u escapes in a string,如果有双引号,则为 ,因此"\u{0590}"将表示字符,但内部可能没有预期的效果regex ,因为您需要以某种方式告诉字符类您需要一系列Unicode代码点,而不是一组可能的8位值。

在这种情况下,您真正​​想要的是 Unicode代码点的PCRE标记,该描述在Escape Sequences下:

  

在UTF-8模式下,允许使用“ \ x {...}”,其中大括号的内容为一串十六进制数字。它被解释为UTF-8字符,其代码号是给定的十六进制数字。

提及“ UTF-8模式”是指the u pattern modifier

  

此修饰符打开与Perl不兼容的PCRE的其他功能。模式和主题字符串被视为UTF-8。无效的主题将导致preg_ *函数不匹配。无效的模式将触发E_WARNING级别的错误。

所以我相信您的模式:

'/^[\u0590-\u05fe ]+$/'

应更改为:

'/^[\x{0590}-\x{05fe} ]+$/u'

请注意,正如u修饰符的手册所暗示的那样,主题字符串必须编码为UTF-8 才能起作用;不支持UTF-16或任何其他Unicode编码。