2012-10-11 184 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]);