2

我正在尝试使用正则表达式检查 PHP 中的用户输入有效性,但我无法弄清楚是什么。我的正则表达式错了

这是我的if声明:

if(is_numeric($_SESSION['l-teacher'])&&preg_match('/^[A-Za-z0-9\u0590-\u05ff\*\-\.\, ]+$/',$_POST['content'])&&preg_match('/^[\u0590-\u05fe ]+$/',$_POST['name'])&&is_numeric($_POST['stars'])&&$_POST['stars']>0&&$_POST['stars']<6){

\ 如果真实 }

我收到以下错误:

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

4

1 回答 1

6

“PCRE”代表“Perl-Compatible Regular Expressions”,但这并不意味着 Perl5 正则表达式中可用的所有功能在 PCRE 中都可用。PHP 手册有一个关于PCRE: Differences from Perl的页面,其中包含与错误消息中的语句类似的语句:

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

PHP(自 7.0 起)确实支持\u字符串中的转义如果它是双引号,那么"\u{0590}"将表示该字符但在正则表达式中可能没有所需的效果,因为您需要以某种方式告诉字符类您想要一个范围Unicode 代码点,而不是一组可能的 8 位值。

在这种情况下,您真正​​想要的是Unicode 代码点的 PCRE 表示法,它在Escape Sequences下进行了描述:

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

提到“UTF-8 模式”是u模式修饰符

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

所以我相信你的模式:

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

应改为:

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

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

于 2019-04-29T14:24:06.050 回答