IPアドレス拒否処理の正規表現とstr_replace

このQ&Aのポイント
  • IPアドレス拒否処理の条件式の意味が分からない
  • クオートしたIPアドレスに「*」か「?」があれば、「数字*」か「数字」に置き換える
  • その結果が$ip_addrに当てはまるか確認している
回答を見る
  • ベストアンサー

IPアドレス拒否処理の正規表現とstr_repla

下記のようなサンプル(の一部)があるのですが、IF文の条件式の意味が分かりません。 while ( $out = $db->fetch_result($result) ) {  $out['ip_addr'] = stripslashes($out['ip_addr']);  if ( !$ip_banned && preg_match('#^'.str_replace(array('\*', '\?'), array('[0-9]*', '[0-9]'), preg_quote($out['ip_addr'])).'$#', $ip_addr) )  $ip_banned = true; 分解してみました。 ・if ( A ) ・A … !$ip_banned && B ・B … preg_match('#^'.C.'$#', $ip_addr) ・C … str_replace(array('\*', '\?'), array('[0-9]*', '[0-9]'), preg_quote($out['ip_addr']) クオートしたIPアドレスに、「*」か「?」があれば、「数字*」か「数字」に置き換える? さらに、その結果が、$ip_addrの中に、当てはまるか、確認? 意味が分かりません……。 IF文の条件式で、何をしようとしている(と想定される)か、教えてください

  • re999
  • お礼率61% (476/777)
  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5078/13272)
回答No.1

たぶん、DBに拒否するIPアドレスが登録されているという前提で動いているのだと想像します。 DBには 192.168.0.* といった形で対象のIPアドレスが登録されていて、それと実際にアクセスしてきたIPアドレス($ip_addr)をpreg_matchで比較しています。 その際、DBに登録されているIPアドレスを正規表現に置き換える処理を行っています。 DBに入っているIPアドレスが 192.168.0.* だとすると、まず preg_quote($out['ip_addr']) で 192\.168\.0\.\* とクオート処理されます。 その後、str_replace で 192\.168\.0\.[0-9]* と置換されます。 その結果、preg_match('#^192\.168\.0\.[0-9]*$#', $ip_addr) が処理されることになります。 またDBに入っているIPアドレスが 192.168.0.10? だとすると、まず preg_quote($out['ip_addr']) で 192\.168\.0\.10\? とクオート処理されます。 その後、str_replace で 192\.168\.0\.10[0-9] と置換されます。 その結果、preg_match('#^192\.168\.0\.10[0-9]$#', $ip_addr) が処理されることになります。

re999
質問者

お礼

回答ありがとうございました。 >DBに拒否するIPアドレスが登録されているという前提で動いているのだと想像します。 >DBには 192.168.0.* といった形で対象のIPアドレスが登録されていて、それと実際にアクセスしてきたIPアドレス($ip_addr)をpreg_matchで比較しています。 >その際、DBに登録されているIPアドレスを正規表現に置き換える処理を行っています。 説明、大変分かりやすかったです。 また、処理毎の説明を解説していただいたので、大変勉強になりましたー

関連するQ&A

  • 正規表現の「^」と「$」がうまくいかない

    正規表現の「^」と「$」を使うとうまく働いてくれません。 あるデータの中の、行頭がhttpで始まる1行を取り出したいです。 あるデータ$dataを preg_match_all("/^http(.*?)$/",$data,$result); print_r($result); で出力すると、 ■結果 Array ( [0] => Array ( ) [1] => Array ( ) ) となり、うまくいきません。 preg_match_all("/http(.*?)\n/",$data,$result); やけでこんな感じにやったら、行頭から始まるhttp.....も行頭からはじまらないものもゲットしてすべて出力してくれてしまいます。 行頭から始まるものだけを出力するにはどうしたらいいでしょうか。 php5 UTF-8環境

    • ベストアンサー
    • PHP
  • preg_replace 後方参照

    preg_replace関数の外で後方参照を行うことはできないですか? $str = '1234abcde' $str = preg_replace("/^(\d+)/", "", $str); この結果は、$str = 'abcde' ですが、()内の数字つまり1234をpreg_replaceの外で確認するには、 $matches = array(); if(preg_match("/^(\d+)/", $str, $matches)){  $str = preg_replace("/^\d+/", "", $str);  $tmp = $matches[1]; //参照 } という風にpreg_matchと併用するしか方法はないのでしょうか? (  perl でいう $str =~ s/^(\d+)//; $tmp = $1; というようなことをしたい。 )

    • ベストアンサー
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 1文字以上のアルファベットと数字の組み合わせは許可(含めて) かつ 「ab」は許可しない(含めない) という正規表現はどのように記述すれば良いのでしょうか?(「01ab」「abc」は許可、「ab」は許可しない) 一応自分なりに考えてみたのですが、 $str = "abc"; if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { print "match<br>\n"; } やはり駄目でした・・・

    • ベストアンサー
    • PHP
  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • php 指定文字列以降の削除

    phpにて半角スペース以降の文字列を問答無用で削除するというプログラムを作ろうとしてるのですが上手くいきません。 どうすればできますでしょうか? ご教授のほどよろしくお願いいたします。 ---- ソースコード $str = '2017/1/1 10-28'; if (preg_match("/ /", $str)){ $replace = str_replace(' ', '', $str); } echo $replace;

    • ベストアンサー
    • PHP
  • 正規表現の\\が認識されない?

    現在、PHPで正規表現を用いてURLをホスト名・パス名・クエリー部分を分けて出力するPGを作成しているのですが。 どうやら、'\\'が'\'(バックスラッシュ)として表現できていないようなのですが? なぜでしょうか? ご教授お願いいたします。 【PG】 $regexが正規表現内容 ↓ $regex = '/^(?:https?|ftp):\/\/([-.!~*\'()\w;:\@&=+\$,%#]+)\/?([-.!~*\'()\w;\/:\@&=+\$,%#]*)\??([\\-.!~*\'()\w;\/:\@&=+\$,%#]*)$/'; if( preg_match($regex, $str, $match) ) { echo $match[1]."\t".$match[2]."\t\n"; } else { echo "URLではありません。\n"; }

    • 締切済み
    • PHP
  • スクリプトの書き方その3

    いつもお世話になります。 XOOPSのコードを読んでいるんですが、沢山の方が関与しているので、 スクリプトの書き方もまちまちです。 そのせいで、素人の私は完全に混乱状態になっています。 ※ PHPマニュアルのサイトでは、preg_xxxっていうのは、 /$str/ とういうように、/(スラッシュ)を使っているので、 !, %, | ? が出てくると、何が正しい書き方なのか全くわかりません。 質問 (1) preg_replace("[\r\n]", "", $str) と preg_replace("/[\r\n]/", "", $str) は同じですか? 質問 (2) preg_replace('!<[^>]*?>!', ' ', $string) と、 preg_replace('/<[^>]*?>/', ' ', $string) は同じですか? 質問 (3) (preg_match('!\W(\w+)$!s', $search, $match) と (preg_match('/\W(\w+)$/s', $search, $match) は同じですか? 質問 (4) preg_replace('?/\*.+\*/?sU', '', $val) の ?とはどういう意味ですか? preg_replace('/\*.+\*/sU', '', $val) と同じですか? それとも、 preg_replace('/?/\*.+\*/?/sU', '', $val) と同じですか? 質問 (5) preg_replace("%(?<!\\\\)'%", "\\'", $string) の、%とはどういう意味ですか? preg_replace("/(?<!\\\\)'/", "\\'", $string) と同じですか? それとも、 preg_replace("/%(?<!\\\\)'%/", "\\'", $string) と同じですか? 迷惑かけますが、どうか、教えて下さい。 よろしくお願いします。

    • 締切済み
    • PHP
  • preg_match()の使い方

    PHPのpreg_match()でメールアドレスが対象のドメインに所属するかどうかをチェックするスクリプトを作成しようと以下を作成しました。 $ptn = preg_quote("abc.co.jp$"); $str = "user1@abc.co.jp"; $cnt = preg_match("/$ptn/", $str, $matches); 予定では上記で$cntに1が入ると考えていたんですが、 0が返ってきてしまいます。 preg_match()の使い方が誤っているのでしょうか? すいませんが、よろしくおねがいします。

    • 締切済み
    • PHP
  • ['SERVER_NAME']と正規表現について

    下記の意味が分かりません。 ( !empty($_SERVER['SERVER_NAME']) && preg_match('#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i', $_SERVER['SERVER_NAME']) ) ? preg_replace('#^www\.#', '.', $_SERVER['SERVER_NAME']) : ''; <分かる範囲> $_SERVER['SERVER_NAME']が空ではなく、かつ、$_SERVER['SERVER_NAME']の中に'#^(?:[a-z0-9\-]+\.){1,}[a-z]{2,}$#i'があったら、$_SERVER['SERVER_NAME']の中の'#^www\.#'を'.'へ置き換え <知りたいこと> 正規表現の所の意味と、結局、この一文で何をしようとしている(と予想される)か、教えてください

    • ベストアンサー
    • PHP

専門家に質問してみよう