我一直在试图找出这个错误的来源。任何帮助解决此错误都将非常感激。
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])){
答案 0 :(得分:3)
[]
包含字符类,它没有订单。为方便起见,您可以在字符类中创建范围,但它必须具有正确的语法。您不能拥有范围6-3
。你需要做这样的事情:
(?:1[6-9]|2[0-9]|30|31)
我也不确定+
是否有意,但我猜不会。
答案 1 :(得分:2)
字符类[16-31]
无效。
它告诉:匹配任何包机:
1
或任何6
到3
的范围内的任何一个!哪个是无效范围。1
您希望匹配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]);