首页 > 后端开发 > php教程 > 为什么我的 PHP preg_match() 在升级到 PHP 7.3 后失败并出现'字符类范围无效”错误?

为什么我的 PHP preg_match() 在升级到 PHP 7.3 后失败并出现'字符类范围无效”错误?

Barbara Streisand
发布: 2024-12-15 10:00:21
原创
494 人浏览过

Why is my PHP preg_match() failing after upgrading to PHP 7.3 with a

preg_match(): 由于字符类范围无效,编译失败

错误消息“preg_match(): 编译失败:无效范围偏移量 20 处的字符类”表示正则表达式模式包含无效的字符类范围。在本例中,该问题是在服务器上升级 PHP 后突然出现的,我们将探讨原因。

错误原因:

PHP 7.3将 PCRE(Perl 兼容正则表达式)引擎升级到 PCRE2,这带来了一些变化,包括更严格的模式验证。特别是,现在在字符类中对连字符 (-) 的处理方式有所不同。

代码片段:

提供的代码使用正则表达式来验证用户名:

/^[a-z0-9]([0-9a-z_-\s])+$/i
登录后复制

在 PHP 的早期版本中,如果连字符被转义或放置在字符类中的任何位置,则可以使用连字符它不能被解释为范围的指示符。

PHP 7.3 的影响:

使用 PCRE2,连字符中的转义 () 不再被忽略类。这意味着在 PHP 7.3 及更高版本中,上面的代码应更新为:

/^[a-z0-9]([0-9a-z_-]\s)$/i
登录后复制

解决方案:

要解决编译错误,请确保连字符类遵循以下规则:

  • 在开始或结束位置使用连字符仅。
  • 如果连字符出现在任何其他位置,请使用反斜杠 () 将其转义。

其他信息:

  • Unicode 属性转义的官方 PHP 文档解释说,以前版本的 PCRE 将连字符视为任何位置的文字字符字符类。
  • 使用 PCRE2,现在会针对无效字符类范围引发特定错误,使问题更加清晰。
  • 对于 7.3 之前的 PHP 版本,解决方法是转义连字符,但在 PHP 7.3 及更高版本中不再需要这样做。

以上是为什么我的 PHP preg_match() 在升级到 PHP 7.3 后失败并出现'字符类范围无效”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板