代码之家  ›  专栏  ›  技术社区  ›  Ariod

字符类中的范围无序

  •  19
  • Ariod  · 技术社区  · 15 年前

    警告:preg_match():编译失败:字符类中偏移量54处的范围顺序错误

    preg_match("/<!--GSM\sPER\sNUMBER\s-\s$gsmNumber\s-\sSTART-->(.*)<!--GSM\sPER\sNUMBER\s-\s$gsmNumber\s-\sEND-->/s", $fileData, $matches);
    

    此正则表达式的作用是解析HTML文件,仅提取以下部分:

    <!--GSM PER NUMBER - 5550101 - START-->
    

    以及:

    <!--GSM PER NUMBER - 5550101 - END-->
    

    7 回复  |  直到 15 年前
        1
  •  8
  •   thomasrutter    9 年前

    如果 $gsmNumber 包含方括号、反斜杠或其他各种特殊字符可能会触发此错误。如果这是可能的,您可能需要验证它,以确保它实际上是在这一点之前的一个数字。

    编辑2016:

    有一个PHP函数可以转义正则表达式中的特殊字符: preg_quote()

    像这样使用:

    preg_match(
      '/<!--GSM\sPER\sNUMBER\s-\s' .
      preg_quote($gsmNumber, '/') . '\s-\sSTART-->(.*)<!--GSM\sPER\sNUMBER\s-\s' .
      preg_quote($gsmNumber, '/') . '\s-\sEND-->/s', $fileData, $matches);
    

    显然,在这种情况下,因为您已经使用同一个字符串两次,所以可以首先将引用的版本分配给变量,然后重新使用它。

        2
  •  77
  •   krang    12 年前

    嗨,我也犯了同样的错误并解决了:

      Warning: preg_match(): Compilation failed: range out of order in character class at offset <N>
    

    .. 范围出错。。 所以定义了一个不能使用的范围。

    我快速看了一下我的正则表达式模式。位置N是“-”。它用于定义“a-z”或“0-9”等范围。

    解决方案

    我只是逃过了“-”。

     \-    
    

    现在它被解释为字符“-”,而不是范围!

        3
  •  9
  •   Estefano Salazar    11 年前

    此错误是由于范围不正确造成的。例如:9-0 a-Z 在您的例子中,您没有转义字符“-”,然后preg\u match尝试解析正则表达式,但由于范围不正确而失败。

        4
  •  6
  •   N Rohler    12 年前

    我收到这个错误的顺序如下:

    [/-.]
    

    只需移动 . 从一开始就解决了这个问题:

    [./-]
    
        5
  •  5
  •   rdiz    10 年前

    虽然其他答案是正确的,但我惊讶地发现,没有人建议用 preg_quote() 在正则表达式中使用它之前。因此,如果您希望匹配一个实际的括号或任何在regex中有意义的东西,它将被转换为一个文字标记:

    $escaped = preg_quote($gsmNumber);
    preg_match( '/<!--GSM\sPER\sNUMBER\s-\s'.$escaped.'\s-\sSTART-->(.*)<!--GSM\sPER\sNUMBER\s-\s'.$escaped.'\s-\sEND-->/s', $fileData, $matches);
    
        6
  •  0
  •   wimvds    15 年前

    你可能让人们插入移动电话号码,包括+,-,(和/或)字符,并按你的预匹配使用这些字符,因此你可能希望在使用之前对提供的数据进行清理(即完全去掉这些字符)。

        7
  •  0
  •   Page Notes    14 年前

    即使是一些非常简单的例子也说明了这个问题,例如。,

        $pattern = '/^[\w_-. ]+$/';
        $uid = 'guest';
        if (preg_match($pattern, $uid)) echo 
          ("<style> p { text-decoration:line-through } </style>");
    

    看到了吗 http://pear.php.net/bugs/bug.php?id=18182 .

    推荐文章