【问题标题】:RegEx failing since PHP 7.4, working in 7.3正则表达式自 PHP 7.4 以来失败,在 7.3 中工作
【发布时间】:2020-09-10 08:51:30
【问题描述】:

任何想法为什么这个 preg_match 可以在 PHP7.2 上运行,但在 7.3+ 上失败?

$word = 'umweltfreundilch'; //real life example :/
preg_match('/^(?U)(.*(?:[aeiouyäöü])(?:[^aeiouyäöü]))(?X)(.*)$/u', $word, $matches);
var_dump($matches);

警告:preg_match():编译失败:在 (? 或 (?-

PHP 7.2 及以下输出:

array(3) {
  [0]=>
  string(16) "umweltfreundilch"
  [1]=>
  string(2) "um"
  [2]=>
  string(14) "weltfreundilch"
}

RegEx 似乎没问题,不是吗?
https://regex101.com/r/LGdhaM/1

【问题讨论】:

  • 在正则表达式中没有äöü 是否可以工作?
  • 不,同样的错误。 sry 应该提到... :)

标签: php regex preg-match


【解决方案1】:

在 PHP 7.3 及更高版本中,Perl 兼容正则表达式 (PCRE) 扩展 was upgraded 到 PCRE2。

PCRE2 syntax documentation 没有将(?X) 列为可用的内联修饰符选项。以下是支持的选项:

  (?i)            caseless
  (?J)            allow duplicate named groups
  (?m)            multiline
  (?n)            no auto capture
  (?s)            single line (dotall)
  (?U)            default ungreedy (lazy)
  (?x)            extended: ignore white space except in classes
  (?xx)           as (?x) but also ignore space and tab in classes
  (?-...)         unset option(s)
  (?^)            unset imnsx options

但是,您实际上可以在尾随分隔符之后使用X 标志:

preg_match('/^(?U)(.*[aeiouyäöü][^aeiouyäöü])(.*)$/Xu', $word, $matches)

PHP 7.4 demo

要取消(?U) 效果,您可以使用以下两个选项之一:(?-U) 内联修饰符,如 in

preg_match('/^(?U)(.*[aeiouyäöü][^aeiouyäöü])(?-U)(.*)$/u', $word, $matches);
//                                           ^^^^^

或者,将受影响的模式包含在 (?U:...) 修饰符组中:

preg_match('/^(?U:(.*[aeiouyäöü][^aeiouyäöü]))(.*)$/u', $word, $matches);
//            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        

preg_match(): Compilation failed: invalid range in character class at offset 中查看有关 PHP 7.3+ 中正则表达式处理更改的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2011-02-17
    • 2018-04-24
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多