簡體   English   中英

字符類中的范圍亂序

[英]Range out of order in character class

我在 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-->

您是否有關於可能導致此錯誤的提示?

嗨,我遇到了同樣的錯誤並解決了它:

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

研究階段:

.. 范圍亂序 ..所以定義了一個不能使用的范圍。

.. 在偏移 N ..我快速查看了我的正則表達式模式。 位置 N 是“-”。 它用於定義“az”或“0-9”等范圍。

解決方案

我只是逃避了“-”。

 \-    

現在它被解釋為字符“-”而不是范圍!

此錯誤是由不正確的范圍引起的。 例如: 9-0 aZ 要更正此問題,您必須將 9-0 更改為 0-9 並將 aZ 更改為 a-zA-Z 在您的情況下,您沒有轉義字符“-”,然后,preg_match 嘗試解析regex 並以不正確的范圍失敗。 轉義“-”,它必須解決您的問題。

如果$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);

顯然,在這種情況下,因為您使用了兩次相同的字符串,您可以先將引用的版本分配給變量並重新使用它。

我收到此錯誤,順序如下:

[/-.]

只需移動. 一開始就解決了這個問題:

[./-]

雖然其他答案是正確的,但我很驚訝地看到沒有人建議在正則表達式中使用變量preg_quote()之前對其進行轉義。 因此,如果您希望匹配實際的括號或任何其他在正則表達式中表示某些內容的內容,則會將其轉換為文字標記:

$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);

您可能讓人們插入手機號碼,包括 +、-、( 和/或 ) 字符,並在 preg_match 中按原樣使用它們,因此您可能希望在使用之前清理提供的數據(即通過完全去除這些字符) .

這是多個版本的 PHP 中的一個錯誤,因為我剛剛驗證了當前 5.3.5 版本,它與 Windows XP 家庭版上的 XAMPP 1.7.4 打包在一起。

甚至一些非常簡單的例子也表現出這個問題,例如,

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

PHP 人員自 2010 年 1 月 10 日起就知道該錯誤。 參見http://pear.php.net/bugs/bug.php?id=18182 該錯誤被標記為“已關閉”但仍然存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM