2012-10-11 183 views
2

我一直在試圖找出這個錯誤來自哪裏。任何幫助解決這個錯誤將不勝感激。PHP preg_match錯誤

錯誤:

Warning: preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 9 in /home/internet/public_html/z-insert/functions/dns.php on line 526 

CODE:直插526是第四的preg_match

if (preg_match('/127\.[0-9]+\.[0-9]+\.[0-9]+/',$mx_ip[$i]) || 
preg_match('/10\.[0-9]+\.[0-9]+\.[0-9]+/',$mx_ip[$i]) || 
preg_match('/192\.168\.[0-9]+\.[0-9]+/',$mx_ip[$i]) || 
preg_match('/172\.[16-31]+\.[0-9]+\.[0-9]+/',$mx_ip[$i])){ 
+2

16-31不是有效範圍 – Nemoden

回答

3

[]包圍字符類,它沒有秩序。您可以爲了方便而在字符類中創建範圍,但它必須是正確的語法。你不能有範圍6-3。你需要做這樣的事情:

(?:1[6-9]|2[0-9]|30|31) 

我也不能肯定是否有+是有意的,但我不會猜測。

2

角色分類[16-31]無效。

它告訴:匹配任何包機是:

  1. 無論是1或任何
  2. 任何範圍爲6開始直到3!哪個範圍是無效的。
  3. 無論是1

看起來要匹配,直到31爲任意數量的範圍內16你可以這樣做:

1[6-9]|2[0-9]|3[01] 

,你分裂的16-31整個範圍成子使用|(或運算符)爲每個子範圍編寫一個正則表達式並對所有子範圍進行分組。

2

首先,正如我所評論的,16-31不是有效範圍。我建議你閱讀this article關於正則表達式中的數字範圍。

作爲一個解決方案,我建議:

*捕捉第二個字節,並與PHP檢查:

$flag = false; 
if (preg_match('/172\.(?P<second_octet>\d+)\.\d+\.\d+/',$mx_ip[$i], $match)) { 
    if ($match['second_octet']>=16 && $match['second_cotet'] <= 31) { 
     $flag = true; 
    } 
} 
if (preg_match('/127\.[0-9]+\.[0-9]+\.[0-9]+/',$mx_ip[$i]) || 
preg_match('/10\.[0-9]+\.[0-9]+\.[0-9]+/',$mx_ip[$i]) || 
preg_match('/192\.168\.[0-9]+\.[0-9]+/',$mx_ip[$i]) || 
$flag 
) { ... 

*通數從16到31明確:

$second_octet_range = range(16,31); 
preg_match('/172\.(?:'.implode('|', $second_octet_range).')\.\d+\.\d+/',$mx_ip[$i]); 

*轉到與你的正則表達式的可讀性較差(恕我直言,由於缺乏可讀性,不太可取的解決方案 - 你真的需要一些時間來理解第二個字節的範圍是16-31,而在前兩種解決方案很明顯):

preg_match('/172\.(?:1[6-9]|2[0-9]|3[01])\.\d+\.\d+/',$mx_ip[$i]);