PHP preg_match错误

时间:2012-10-11 03:13:28

标签: php preg-match

我一直在试图找出这个错误的来源。任何帮助解决此错误都将非常感激。

ERROR:

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

代码:-line 526是第4个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])){

3 个答案:

答案 0 :(得分:3)

[]包含字符类,它没有订单。为方便起见,您可以在字符类中创建范围,但它必须具有正确的语法。您不能拥有范围6-3。你需要做这样的事情:

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

我也不确定+是否有意,但我猜不会。

答案 1 :(得分:2)

字符类[16-31]无效。

它告诉:匹配任何包机:

  1. 1或任何
  2. 63的范围内的任何一个!哪个是无效范围。
  3. 要么1
  4. 您希望匹配16范围内的任何数字,直至31,您可以这样做:

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

    16-31的整个范围拆分为子范围,为每个子范围编写一个正则表达式,并使用|(或运算符)对所有子范围进行分类。

答案 2 :(得分: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,而前两个解决方案显而易见):< / p>

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