2

我一直在扯头发,试图找出这个错误来自哪里。任何解决此错误的帮助将不胜感激。

错误:

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])){
4

3 回答 3

3

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

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

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

于 2012-10-11T03:18:10.340 回答
2

字符类[16-31]无效。

它告诉:匹配任何章程:

  1. 一个1或任何一个
  2. 任何在从6到开始的范围内3!!!这是无效的范围。
  3. 要么1

看起来你想匹配范围内的任何数字,16直到31你可以这样做:

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

在将整个范围拆分16-31为子范围的地方,为每个子范围编写一个正则表达式,并使用|(或运算符)将所有子范围包含在内。

于 2012-10-11T03:18:33.907 回答
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]);
于 2012-10-11T03:25:14.140 回答