2011-07-08 10 views
6

Devolveré los datos del teléfono móvil en función del agente de usuario. Pero en un caso donde no se almacena el agente de uso (versión más reciente de teléfono o software), quiero poder devolver la coincidencia más cercana, un poco como Google muestra el "¿lo dijiste?". es decirPHP - devolver la coincidencia más cercana de la base de datos

si tengo un agente de usuario almacenada de

Mozilla/5.0 (Linux; U; Android 2,1-Update1; en-nl; Desire_A8181 Construir/ERE27) AppleWebKit/530.17 (KHTML, como Gecko) Versión/4.0 Mobile Safari/530,17

y el agente de usuario en uso es

Mozilla/5.0 (Linux; U; Andr oid 2.1-update1; en-nl; Desire_G45H Construir/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari /530,17

Quiero ser capaz de devolver la almacenada para agregar o adaptar mis datos en consecuencia.

¿Alguien sabe una manera de lograr esto?

+0

Si se quiere desarrollar su propio sistema que bien por mí, pero .... ¿Tomó un vistazo a http : //docs.php.net/function.get_browser y el browscap.ini generalmente más rápido que la luz actualizado en http://browsers.garykeith.com/downloads.asp? – VolkerK

+0

Si solo desea ocuparse de esto en el nivel de la base de datos, debe eliminar la etiqueta php. – Stijn

Respuesta

0

Eche un vistazo a uno de los scripts en Highlight the difference between two strings in PHP, con algunas modificaciones podrá obtener un porcentaje de la diferencia.

+0

Eso es dos cadenas, podría escribir mi propia función para la que o utilizar levenshtein() pero esto es una cuestión de eficiencia SQL y se preguntaba si había un equivalente SQL –

2

El enfoque habitual para la coincidencia de cadenas difusas son cosas como calcular la distancia levenshtein o implementarla como un índice de búsqueda de n-gramas. Pero para hacer coincidir los agentes de usuario, esto es excesivo.

reducir el contrario la cadena que buscar a ciertos criterios importantes, a continuación, hacer algo como

SELECT * FROM agents WHERE agent LIKE "Mozilla/5.0 (Linux; U; Android%) AppleWebKit/5% Version/4.0 Mobile Safari/5%" 

Por lo tanto, se tira a cabo ciertas partes muy detalladas y reemplazarlos por% en su instrucción LIKE. Sin embargo, debería reconsiderar la arquitectura: solo guardaría las partes importantes y omitiría el número de compilación exacto, etc. También consideraría usar una biblioteca externa que ya contenga agentes de usuario y haga la correspondencia por usted, sin necesidad de reinventar la rueda.

EDITAR: al igual que VolkerK señaló anteriormente, la "biblioteca externa" debe ser PHPs getbrowser. Acabo de agregar para la competencia de la respuesta ;-)

+0

Tengo una base de datos de 6.549 dispositivos móviles todos con múltiples agentes de usuario contra ellos, no estoy reinventando la rueda, simplemente alisando los bordes. Gracias por el método anterior, lo intentaré. Saludos –

+0

Solo para estar seguro: ¿sabes de http://wurfl.sourceforge.net/? –

4

utilizar el texto completo buscando con la información más relevante ...

SELECT * MATCH(browser) AGAINST ('your browser') AS score order by score DESC 
+0

interesante, ¿tendría que usar un límite aunque correcto ya que todavía devolvería todos los resultados solo en orden? Definitivamente mirará esto. –

+0

Tenga en cuenta, sin embargo, que el índice de texto completo de MySQL es una bestia con algunos problemas - por ejemplo, la longitud de palabra mínima es de 4 caracteres: en "530.17", sería automáticamente siempre ignorar la parte de" 0,17" . Además, el criterio de coincidencia más cercano es un poco defectuoso. Funciona bien para textos naturales, pero tal vez no para agentes de usuario. –

+0

puede cambiar la longitud de palabra mínima y desactivar las palabras vacías, que son un dolor aún mayor. ver http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html – sgroves

0

Para obtener el mejor resultado, puede extraer el conjunto de registros y hacer un ciclo de adivinar quién es la palabra más similar

verifique estas funciones

SIMILAR_TEXT

SOUNDEX

LEVENSHTEIN

POR EJEMPLO

$most_similar = ""; 
$highestPercentage = 0; 
foreach ($ua in $all_user_agents) { 
    $i = similar_text($current_user_agent, $ua, &$p); 
    if ($p > $highestPercentage) { 
     $highestPercentage = $p; 
     $most_similar = $ua; 
    } 
} 

echo "most similar = $most_similar" 

De todos modos, se puede utilizar el texto completo de MySQL-búsqueda siguiendo algunas pautas como this one

Cuestiones relacionadas