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

コード: -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

[]順序のない文字クラスを囲みます。便宜上、文字クラス内に範囲を作成できますが、正しい構文である必要があります。range を持つことはできません6-3。次のようなことをする必要があります:

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

+意図的なものかどうかもわかりませんが、そうではないと思います。

于 2012-10-11T03:18:10.340 に答える
2

まず、コメントしたように、16 ~ 31 は有効な範囲ではありません。this article正規表現の数値範囲について読むことをお勧めします。

私が提案する解決策として:

* 2 番目のオクテットをキャプチャし、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]);

* 正規表現の可読性の低いバリアントを使用します (IMHO、可読性の欠如のため、あまり好ましくないソリューション - 最初の 2 つのソリューションでは明らかであるのに対し、2 番目のオクテットの範囲が 16-31 であることを理解するには時間がかかります):

preg_match('/172\.(?:1[6-9]|2[0-9]|3[01])\.\d+\.\d+/',$mx_ip[$i]);
于 2012-10-11T03:25:14.140 に答える
2

文字クラス[16-31]が無効です。

それは次のことを伝えます:

  1. a1または any
  2. から始まる6までの範囲内の任意の3!!! これは無効な範囲です。
  3. どちらか1

16あなたができるまで、範囲内の任意の数字と一致させたいようです31

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

範囲全体をサブ範囲に分割し、各サブ範囲の正規表現を記述し、 (または演算子)16-31を使用してすべてのサブ範囲をクラブします。|

于 2012-10-11T03:18:33.907 に答える