0

「Mozilla/5.0」のユーザーエージェントに付属するIPアドレス(その後にWebkitなどはありません。明示的にMozilla / 5.0のみ)またはnullをログに記録する必要があります。私はpreg_matchで遊んでいますが、幸運はありません。私はそれがコードの最もきれいなものではないことを知っていますが、それはただ仕事を成し遂げようとしているだけです。preg_matchを正しく機能させるには、どのような変更を加える必要がありますか?

<?php
    $ip = $_SERVER['REMOTE_ADDR']; 
    $agent = $_SERVER['HTTP_USER_AGENT'];                                   
    $date = date("H:i dS F"); 
    $file = "log.html"; 

 if (preg_match("/\bMozilla\/5.0/", $agent))  {
            $open = fopen($file, "a+");
                fwrite($open, $ip . " | ".$agent." | ". $date); 
            fclose($open); 

} elseif (preg_match("/Null/", $agent))  {
            $open = fopen($file, "a+"); 
                fwrite($open, $ip . " | ".$agent." | ". $date);  
            fclose($open); 
} 
?>
4

3 に答える 3

0

strpos だけを使用しないのはなぜですか? これには正規表現はやり過ぎです。

if (strpos($agent, 'Mozilla/5.0') !== false)
{
   //
}
else
{
   //
}

本当に preg_match を使用したい場合は、これでうまくいくはずです:

if (preg_match("/^Mozilla\/5\.0/", $agent))  {
于 2012-09-19T13:28:29.237 に答える
0

ヒント:
-デリミタ\が文字列に含まれている場合は変更してください:リスト
を参照してください -\b閉じられていませんでした
- 使用してくださいfile_put_contents

この関数は、fopen()、fwrite()、および fclose() を連続して呼び出して、データをファイルに書き込むのと同じです。
filename が存在しない場合、ファイルが作成されます。さもないと。
FILE_APPEND フラグを使用してコンテンツをファイルの末尾に追加し、LOCK_EX フラグを使用して
他のユーザーが同時にファイルに書き込むのを防ぎます。

試す

<?php
    $ip = $_SERVER['REMOTE_ADDR']; 
    $agent = $_SERVER['HTTP_USER_AGENT'];                                   
    $date = date("H:i dS F"); 
    $file = "log.html"; 

 if (preg_match("#\bMozilla/5.0\b#", $agent))
 {
  var_dump($agent);
  //return 'Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0'
  $content  =  " $ip  | $agent | $date ";
  file_put_contents($file, $content, FILE_APPEND | LOCK_EX);
  }
 ?>
于 2012-09-19T13:08:11.387 に答える
-1

この関数を使用して、ユーザーエージェントから IP を取得します

<?php
# validip/getip courtesy of manolete <manolete@myway.com>
# IP Validation
function validip($ip) {
    if (!empty($ip) && $ip==long2ip(ip2long($ip))) {
        # reserved IANA IPv4 addresses
        # http://www.iana.org/assignments/ipv4-address-space
        $reserved_ips = array (
            array('0.0.0.0','2.255.255.255'),
            array('10.0.0.0','10.255.255.255'),
            array('127.0.0.0','127.255.255.255'),
            array('169.254.0.0','169.254.255.255'),
            array('172.16.0.0','172.31.255.255'),
            array('192.0.2.0','192.0.2.255'),
            array('192.168.0.0','192.168.255.255'),
            array('255.255.255.0','255.255.255.255')
        );

        foreach ($reserved_ips as $r)
            if ((ip2long($ip) >= ip2long($r[0])) && (ip2long($ip) <= ip2long($r[1])))
                return false; 
        return true;
    }
    return false;
}

/* Patched function to detect REAL IP address if it's valid */
function getip() {
    if (getenv('HTTP_CLIENT_IP') && long2ip(ip2long(getenv('HTTP_CLIENT_IP')))==getenv('HTTP_CLIENT_IP') && validip(getenv('HTTP_CLIENT_IP')))
        return getenv('HTTP_CLIENT_IP');

    if (getenv('HTTP_X_FORWARDED_FOR') && long2ip(ip2long(getenv('HTTP_X_FORWARDED_FOR')))==getenv('HTTP_X_FORWARDED_FOR') && validip(getenv('HTTP_X_FORWARDED_FOR')))
        return getenv('HTTP_X_FORWARDED_FOR');

    if (getenv('HTTP_X_FORWARDED') && long2ip(ip2long(getenv('HTTP_X_FORWARDED')))==getenv('HTTP_X_FORWARDED') && validip(getenv('HTTP_X_FORWARDED')))
        return getenv('HTTP_X_FORWARDED');

    if (getenv('HTTP_FORWARDED_FOR') && long2ip(ip2long(getenv('HTTP_FORWARDED_FOR')))==getenv('HTTP_FORWARDED_FOR') && validip(getenv('HTTP_FORWARDED_FOR')))
        return getenv('HTTP_FORWARDED_FOR');

    if (getenv('HTTP_FORWARDED') && long2ip(ip2long(getenv('HTTP_FORWARDED')))==getenv('HTTP_FORWARDED') && validip(getenv('HTTP_FORWARDED')))
        return getenv('HTTP_FORWARDED');

    $ip = htmlspecialchars($_SERVER['REMOTE_ADDR']);
    /* Added support for IPv6 connections. otherwise ip returns null */
    if (strpos($ip, '::') === 0) {
        $ip = substr($ip, strrpos($ip, ':')+1);
    }
   return long2ip(ip2long($ip));
}
?>
于 2012-09-19T13:07:51.723 に答える