Llevo tiempo buscando una expresión regular para poder cargar los registros del fichero de accesos de un servidor web (Apache). Al final, cómo lo que encontraba no me convencía, he decidido hacerlo yo mismo. Aquí os dejo el resultado:
Código PHP:
$str = '... fila del archivo access del webserver ...';
if (preg_match('/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) -([\w\s]*) - \[(.*)\] "(.*) (.*) HTTP\/(.*)" (\d+) (\d+|-) "(.*)" "(.*)"/', $str, $match)) {
$log = array();
$log['ip'] = $match[1];
$log['user'] = $match[2];
$log['datestr'] = $match[3];
$log['option'] = $match[4];
$log['url'] = $match[5];
$log['http'] = $match[6];
$log['code'] = $match[7];
$log['bytes'] = $match[8];
$log['ref'] = $match[9];
$log['agent'] = $match[10];
}
Un ejemplo de un registro de acceso con los que he hecho las pruebas sería:
Código:
Para el registro anterior, el contenido de $log sería el siguiente:11.22.33.44 - - [01/Sep/2007:14:00:41 +0200] "GET /img/es.png HTTP/1.1" 200 271 "http://www.miservidor.com/" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.1)"
Código PHP:
$log['ip'] = '11.22.33.44';
$log['user'] = '';
$log['datestr'] = '01/Sep/2007:14:00:41 +0200';
$log['option'] = 'GET';
$log['url'] = '/img/es.png';
$log['http'] = '1.1';
$log['code'] = 200;
$log['bytes'] = 271;
$log['ref'] = 'http://www.miservidor.com/';
$log['agent'] = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; InfoPath.1)';