首页 >后端开发 >php教程 >升级到 PHP 7.3 后,为什么我的 PHP 正则表达式会生成'preg_match(): 编译失败:字符类中的范围无效”?

升级到 PHP 7.3 后,为什么我的 PHP 正则表达式会生成'preg_match(): 编译失败:字符类中的范围无效”?

Susan Sarandon
Susan Sarandon原创
2024-12-06 01:37:13247浏览

Why Does My PHP Regex Produce

字符类中的范围无效:了解 PHP 升级后的问题

错误消息“preg_match(): 编译失败:字符类中的范围无效”表示存在问题与提供的代码中使用的正则表达式。 PHP 升级后可能会出现此问题,特别是由于 PCRE2 库的更改而从早期版本迁移到 PHP 7.3 或更高版本时。

PHP 7.3 中向 PCRE2 的转变

使用 PHP 7.3 ,PHP PCRE引擎过渡到PCRE2,导致几个向后不兼容的问题更改:

  • “S”修饰符无效,因为会自动研究模式。
  • “X”修饰符在 PCRE2 中表现为默认值,没有重大影响。
  • Unicode 10 在 PCRE2 中实现,可能会引入无效的行为更改

字符类中的连字符:PHP 7.3 之前和之后

在 PHP 7.3 之前,连字符可以在字符类中的任何位置使用(如果转义或放置在它们不能使用的地方)不表示范围。但是,在 PHP 7.3 及更高版本中,PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL 默认设置为 false。

因此,要在字符类中包含连字符:

  • 在开头或结尾处使用它这

示例:

在提供的代码中,有问题的行是:

if(!preg_match("/^[a-z0-9]([0-9a-z_-\s])+$/i", $subuser)){

问题出在字符内的连字符 (-)类 [0-9a-z_-s]。要修复此问题,请将连字符放在末尾或开头:

if(!preg_match("/^[a-z0-9]([0-9a-z\_-\s0-9a-z\_-\s])+$/i", $subuser)){

其他参考:

“PHP 7.3:PCRE2 已删除 PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL” 提供了进一步的见解:

PCRE2在模式验证方面更加严格,因此升级后,一些您现有的模式无法再编译。

因此,可能需要对现有模式进行仔细审查和修改,以确保与 PHP 7.3 及更高版本中的 PCRE2 兼容。

以上是升级到 PHP 7.3 后,为什么我的 PHP 正则表达式会生成'preg_match(): 编译失败:字符类中的范围无效”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn