2011-06-24 15 views
4

これは私の最初の質問ですので素敵です:)私はregexpを構築して、RFC 1918に従ったプライベートIPではなく、有効な(適切なIPv4形式で)少なくとも有効なIP配列を取得しようとしています。これまでのところ、私はちょうど反対、私はsucccssfulyプライベートIPに一致することを意味するので、私が必要とするものは、アサーションを元に戻す方法です。これは、これまでのコードです:PHP RegExp逆アセンブルを逆にするには

// This is an example string 
$ips = '10.0.1.23, 192.168.1.2, 172.24.2.189, 200.52.85.20, 200.44.85.20'; 

preg_match_all('/(?:10\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])|192\.168)\.\d{1,3}\.\d{1,3}/', $ips, $matches); 

print_r($matches); 

// Prints: 
Array 
(
    [0] => Array 
    (
    [0] => 10.0.1.23 
    [1] => 192.168.1.2 
    [2] => 172.24.2.189 
) 
) 

そして、何私が結果として必要がある:

Array 
(
    [0] => Array 
    (
    [0] => 200.52.85.20 
    [1] => 200.44.85.20 
) 
) 

私は(陰性であることを表現(先読み)の最初の部分を変更しようとしました?! )しかし、これは結果を混乱させ、結果を切り替えることさえしない。

これ以上の情報提供が必要な場合は、お気軽にお気軽にお問い合わせください。

+0

最初の非キャプチャグループの正規表現にparanthesisがありませんか? –

+0

慎重に見れば、[01]と[168]という2つの閉じ括弧があります。 – Proteo

+0

あなたは私のためにコードを掲示し、あなたの質問を明確に述べるためだけに+1を得る。これは見た目よりも丈夫です。私は、文字列を分割し、各IPを個別にチェックするソリューションを考え出しました。質問に対する正確な答えではありません。あなたが私にそれを投稿してもらいたいかどうか知らせてください。 – Cfreak

答えて

0

あなたがしたいすべてがIPの比較的小さな範囲を除外することであるならば、あなたはこの を行うことができます(私はしなかった場合のいずれかのタイプミスの):Perlで

/(?!\b(?:10\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])|192\.168)\.\d{1,3}\.\d{1,3}\b)\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b)/ 

例:

use strict; 
use warnings; 

my @found = '10.0.1.23, 192.168.1.2, 172.24.2.189, 200.52.85.20, 200.44.85.20' =~ 
/
(?! 
    \b 
    (?: 
     10\.\d{1,3} 
     | 
     172\. 
     (?: 
      1[6-9] 
      | 2\d 
      | 3[01] 
     ) 
     | 
     192\.168 
    ) 
    \.\d{1,3} 
    \.\d{1,3} 
    \b 
) 
\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b) 
/xg; 

for (@found) { 
    print "$_\n"; 
} 

出力:

200.52.85.20
200.44.85.20

+0

多くのありがとうございました。それは私が求めているものです。しかし、私は実際にMatteoのヒントを使って実際の検証を行っています。あなたは2つの答えに投票できません。 – Proteo

4

PHP関数があります。filter_var()です。これらの定数を確認してください:FILTER_FLAG_IPV4,FILTER_FLAG_NO_PRIV_RANGE

しかし、これを正規表現で解決したい場合は、問題を2つに分割することをお勧めします。最初にすべてのIPアドレスを抽出し、プライベートなものを除外します。

+0

ありがとう、非常に有望に見えます。文字列に対してフィルタを使用する最も簡単な方法は何でしょうか?私はそれを正規表現に含めることはできないと思いますよね? – Proteo

+0

IPアドレスのように見える*ものを取り出し、その機能に渡します。 –

関連する問題