Ver Mensaje Individual
  #31 (permalink)  
Antiguo 26/05/2008, 09:02
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: La solución definitiva para los conflictos entre navegadores

Un nuevo aporte, a ver si les gusta

Código PHP:
<?php 

header
("Content-type: text/css");  

# contenido de la matriz: nombre, patrón, valor de la propiedad que debe cambiar (o nombre de la hoja de estilos específica para él)
# para más propiedades, simplemente se puede agregar elementos al vector...
$navegadores = array(   array( 'Opera',  'Opera'120 ),
                        array( 
'Safari''Safari'121 ),
                        array( 
'Mozilla Firefox''(Firebird)|(Firefox)'122 ),
                        array( 
'Galeon''Galeon'123 ),
                        array( 
'Konqueror''Konqueror'128 ),
                        array( 
'Mozilla''Gecko'124 ),
                        array( 
'MyIE''MyIE'125 ),
                        array( 
'Lynx''Lynx'126 ),
                        array( 
'Netscape''(Mozilla/4\.(75|79|08|5|6))|(Netscape(6|8))'127 ),
                        array( 
'Internet Explorer 7''(MSIE 7\.[0-9]+)'129 ),
                        array( 
'Internet Explorer 6''(MSIE 6\.[0-9]+)'130 ),
                        array( 
'Internet Explorer 5''(MSIE 5\.[0-9]+)'131 ),
                        array( 
'Internet Explorer 4''(MSIE 4\.[0-9]+)'132 )
                    );

function 
ObtenerNavegador($user_agent) {
    global 
$navegadores;

    foreach(
$navegadores as $indice => $navegador) {
        if ( 
ereg($navegador[1], $user_agent))
            return 
$indice;
    }

    return -
1;
}

$navegador ObtenerNavegador($_SERVER['HTTP_USER_AGENT']); 

function 
valorCSS() {
    global 
$navegador;
    global 
$navegadores;

    if (
$navegador == -1) {
        return 
$valor_por_defecto;
    } else {
        return 
$navegadores$navegador ][2];
    }

?> 

/* Comienzan los estilos normalmente */ 

div.enlace { 
  font-family: Verdana, Tahoma, Arial, Helvetica, sans-serif; 
  font-size: 11px; 
  font-weight: bold; 
  background: #777; 
  width : <?php echo valorCSS(); ?>px;
  height: 30px; 
  line-height: 30px; 
  margin: 20px auto; 
}
meta, me refería a que por el orden en el que está hecho el vector se va a comprobar primero que la cadena "User-Agent" contenga "Gecko", y si eso es verdadero se asigna como "Mozilla".
Y entonces, dado que Konqueror incluye "Gecko" en su identificación, se tomará como Mozilla.
Lo que decía del "orden" es lo que hice en este nuevo código: poner la búsqueda de "Konqueror" antes que la de "Gecko".

Otro detalle: quizás para ahorrar unos milisegundos se pueda organizar el vector según el uso de los navegadores: poner los más usados primero para ahorrar un par de llamadas a ereg.
Y un detalle más: cambié "eregi" por "ereg", en mis pruebas la comparación sin considerar mayúsculas y minúsculas es más lenta que la comparación "estricta".


Saludos.