【问题标题】:preg_match pattern dosn't work in php v 5preg_match 模式在 php v 5 中不起作用
【发布时间】:2017-12-19 15:33:32
【问题描述】:

我正在使用 php 版本 5.4.45 。 我在 php 版本 7 中测试此代码并且工作正常但在版本 5.4.45 中不工作

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

在 v7 中返回:

0+19301234567

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

9301234567

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

【问题讨论】:

  • 使用/^9\d{9}/
  • 我已经在 3v4l.org/#preview 上测试了你的代码,它适用于 5.4.45。
  • 转义单词字符没有意义,并导致未定义的行为。

标签: php regex preg-match


【解决方案1】:

在 php 5.34 和 php 7.01 中都对此进行了测试:

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

第一个9之前不需要\

【讨论】:

    【解决方案2】:

    试试看:

    $string = '9301234567';
    if( preg_match('/^[9]\d{9}/', $string) ) 
    {
        $string = '0+1'.$string ;
        return $string ;
    }
    

    【讨论】:

      【解决方案3】:

      简介

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

      编辑 - 研究

      我深入研究了这种行为变化以及PHP 5.5.10 they upgraded PCRE to version 8.34。翻阅changelogs for PCRE,现在发现PCRE 8.34版本引入了如下改动:

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

      代码

      改用这个正则表达式。

      /^9\d{9}/
      

      用法

      See code in use here

      <?php
      
      $string = '9301234567';
      if( preg_match('/^9\d{9}/', $string) ) 
      {
          $string = '0+1'.$string ;
          print $string ;
      }
      

      【讨论】:

      • 知识这么深。+1
      猜你喜欢
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      相关资源
      最近更新 更多