2016-05-13 5 views
0

でのIPアドレスのホワイトリストはマッチ私はIPのリストを持っているPHP

$whitelist=array('50*','202.16*','123.168*','); 

のように、私はページを見てから、他のすべてのトラフィックをブロックしたい範囲です。

私はこれがあなたのために働く必要があります

if(in_array($_SERVER['REMOTE_ADDR'],$whitelist)){ 
    //display page 
    } 
+0

ので何:あなたは...それは大丈夫だと思ったよう

if(preg_match('/^(' . implode('|', $whitelist) . ')/i', $_SERVER['REMOTE_ADDR'])){ // Do your stuff } 

あなたの「*」は動作しません。 「うまく動かない? –

+0

承認済みのIPアドレスの訪問者にはページが表示されません – mustacheMcGee

+0

私はこれまでにsucessと同様のものを使用しました。まず、あなたのサーバアドレス '$ ip = $ _SERVER ['REMOTE_ADDR'];を取得し、ドットで爆発させて' $ if'に割り当て、 '$ if'とblack/whiteリストの両方をチェックする必要があります。 –

答えて

3

in_arrayは、正規表現を使用して比較しません。また、あなたの正規表現は間違っています*は量子です。これにより、前の文字の0個以上が許可されます。

試してください:.*が何かを許可され

$whitelist=array('50\..*','202\.16\..*','123\.168\..*'); 
if(preg_match('/^(' . implode('|', $whitelist) . ')/', $_SERVER['REMOTE_ADDR'])){ 

は(ほとんど(参照s修飾子http://php.net/manual/en/reference.pcre.pattern.modifiers.php)、.は、任意の文字であり、その後、前述のよう数量詞とペア)。
^が文字列の先頭です。
\.は、リテラル.です。
|は、またはです。

デモ:https://eval.in/571019
正規表現デモ:regexsを使用していない@ chris85、in_arrayで述べたようにhttps://regex101.com/r/dC5uI0/1

+0

私はこの1つを使用していたものを置き換えるべきだと思っています*笑*ロバスト。 –

+0

@ Fred-ii-あなたのものは何ですか? – chris85

+0

私はOPの質問のもとに残しました。 {$ var [1]}。{$ var [2]} 'はサーバアドレスから展開して配列から存在するかどうかをチェックしますが、チェックする際には非効率的です最初の要素は、配列を減らしたり、配列に追加する必要があります。それはうまくいきますが、あなたの方法は非常に扱いが簡単です。 –

1

を試してみた:

のことができます。ホワイトリストのIPおよびトリムスペースをループし*(右から見つかった場合)。

substrを使用した後、ループ内のホワイトリストIPの同じ長さのIPアドレスを切断して両方を比較できます。

$whitelists = array('50*','202.16*','123.168*'); 
foreach($whitelists as $whitelist){ 
    $whitelist = rtrim($whitelist, "*\r\n\t\0 "); 
    if(substr($_SERVER['REMOTE_ADDR'], 0, strlen($whitelist)) == $whitelist) { 
     $match = true; 
     break; 
    } 
} 
echo $match ? 'Match' : 'Not Match'; 
1

そのようなことを行うには、単にこのようにループを使用することができます。

$whitelist=array('50\.*','202.16\.*','123.168\.*'); 
+2

なぜクリスの答えに重複した答えとピギーバックを付けるのですか?私が見ているのは違うのは、追加された 'i'だけです。 –

関連する問題