字符类中的范围无序

2022-08-30 14:21:55

我在preg_match()函数中得到了这个奇怪的错误:

警告: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-->

您是否有可能导致此错误的提示?


答案 1

嗨,我得到了同样的错误并解决了它:

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

研究阶段:

..范围无序 ..因此,定义了一个无法使用的范围。

.. 在偏移量 N 处 ..我快速浏览了我的正则表达式模式。位置 N 是“-”。它用于定义范围,如“a-z”或“0-9”等。

溶液

我只是逃脱了“-”。

 \-    

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


答案 2

如果包含方括号、反斜杠或其他各种特殊字符,则可能会触发此错误。如果可能的话,您可能需要验证它,以确保它实际上是一个数字。$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);

显然,在这种情况下,由于您已经两次使用相同的字符串,因此您可以先将带引号的版本分配给变量并重新使用它。


推荐