preg_match模式在php v 5中不起作用

cre*_*hea 3 php regex preg-match

我正在使用PHP版本5.4.45.我在php版本7中测试此代码并且工作正常但在5.4.45版本中无效

$string = '9301234567';
if( preg_match('/^\9\d{9}/', $string) ) 
{
    $string = '0+1'.$string ;
    return $string ;
}
Run Code Online (Sandbox Code Playgroud)

在v7返回:

0+19301234567
Run Code Online (Sandbox Code Playgroud)

但是在v5.4.45中返回(preg_match返回false)

9301234567
Run Code Online (Sandbox Code Playgroud)

我怎么能preg_match('/^\9\d{9}/', $string) 在php v5.4.45中使用?谢谢

ctw*_*els 6

简要

你的模式是/^\9\d{9}/.请注意,那里有一个\9.这通常被解释为反向引用(这是您早期版本的PHP中发生的事情).我想解释器现在更聪明,并且意识到你的子模式\9不存在,所以它将它理解为文字9.

编辑 - 研究

我深入研究了这种行为的变化,在PHP 5.5.10中,他们将PCRE升级到版本8.34.查看PCRE的更改日志,现在,我发现PCRE版本8.34引入了以下更改:

  1. Perl已经改变了对\ 8和\ 9的处理.如果之前没有遇到这些数字的捕获组,则将它们视为文字字符8和9,而不是二进制零,后跟文字.PCRE现在也是如此.

码

请改用此正则表达式.

/^9\d{9}/
Run Code Online (Sandbox Code Playgroud)

用法

请参阅此处使用的代码

<?php

$string = '9301234567';
if( preg_match('/^9\d{9}/', $string) ) 
{
    $string = '0+1'.$string ;
    print $string ;
}
Run Code Online (Sandbox Code Playgroud)