6
votes

PHP - retourner la correspondance la plus proche de la base de données

Je retourne des données de téléphone mobile en fonction de l'agent utilisateur. Mais dans une instance où le nomAgent n'est pas stocké (version plus récente du téléphone ou du logiciel), je souhaite pouvoir retourner la correspondance la plus proche, un peu comme comment Google affiche le "Voulez-vous dire cela". c'est-à-dire

Si j'ai un utilisateur stocké de

Mozilla / 5.0 (Linux; U; Android 2.1-update1; en-nl; Desire_a8181 Build / ere27) Applewebkit / 530.17 (Khtml, comme gecko) version / 4.0 mobile Safari / 530.17

et l'agent utilisateur utilisé est

Mozilla / 5.0 (Linux; U; Android 2.1-update1; en-nl; Desire_g45h Build / ere27) Applewebkit / 530.17 (Khtml, comme gecko) version / 4.0 mobile Safari / 530.17

Je veux pouvoir retourner celui stocké pour ajouter ou adapter mes données en conséquence.

Est-ce que quelqu'un connaît une façon de réaliser cela?


2 commentaires

Si vous souhaitez développer votre propre système qui va bien, mais ... Avez-vous consulté docs.php.net/funcunction.get_browser et le Browscap.ini actualisé habituellement plus rapide que la lumière à navigateurs.garykeith.com/downloads.asp ?


Si vous souhaitez seulement m'occuper de cela sur le niveau de la base de données, vous devez supprimer la balise PHP.


5 Réponses :


0
votes

Jetez un coup d'œil à l'un des scripts sur souligne la différence entre Deux chaînes de PHP , avec quelques modifications que vous devriez pouvoir obtenir un pourcentage de la différence.


1 commentaires

C'est deux chaînes, je pourrais écrire ma propre fonction pour cela ou utiliser Levenshtein (), mais il s'agit d'une question d'efficacité SQL et de vous demander s'il y avait un équivalent SQL



2
votes

L'approche habituelle de la correspondance de chaînes floue est des éléments tels que calculer la distance de Levenshtein ou la mettre en œuvre comme un indice de recherche N-GRAM. Mais pour assortir les agents utilisateur, ceci est surchargé.

RÉDUIRE plutôt la chaîne que vous recherchez à certains critères importants, puis faites quelque chose comme xxx

donc, vous sortez certainement certain parties trop détaillées et remplacez-les par% dans votre déclaration similaire. Vous devez toutefois reconsidérer l'architecture - je ne sauverrais que les parties importantes et laissez le numéro de construction exact, etc. Envisagez également d'utiliser une bibliothèque externe qui contient déjà des agents utilisateur et qui correspond à vous, pas besoin de réinventer la roue.

Edit: Tout comme Volkerk a souligné ci-dessus, la "bibliothèque externe" doit être getbrowser phps . Vient d'être ajouté pour le mobilier de la réponse; -)


1 commentaires

J'ai une base de données de 6 549 appareils mobiles, tous avec plusieurs agents utilisateur contre eux, je ne refuse pas la roue, il suffit de lisser les bords. Merci pour la méthode ci-dessus, je vais essayer. Salutations



4
votes

Utilisez la recherche de texte intégral avec la plupart des données pertinentes ...

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


3 commentaires

Intéressant, il faudrait utiliser une limite bien que cela puisse toujours renvoyer tous les résultats dans l'ordre? Va avoir peur de cela.


Sachez cependant que l'indice FullText MySQL FullText est une bête avec certains problèmes - par exemple, la longueur de mot minimale est de 4 caractères: dans "530.17", il ignorerait automatiquement la partie ".17". En outre, les critères de correspondance les plus proches sont un peu défectueux. Cela fonctionne bien pour les textes naturels, mais peut-être pas pour les agents utilisateur.


Vous pouvez modifier la longueur minimale du mot et désactiver les mots stops, qui sont une douleur encore plus grande. Voir dev.mysql.com/doc/refman/5.1 /en/fulltext-fine-tuning.html



0
votes

utiliser Recherche en texte intégral ; Sinon, ces fonctions peuvent aider:


1 commentaires

Encore une fois, je ne veux pas sélectionner chaque chaîne d'agent d'utilisateur de mon dB et comparer, ce n'est pas efficace.



0
votes

Pour obtenir le meilleur résultat, vous pouvez extraire les enregistrements entiers et faire un cycle pour deviner qui est le mot le plus similaire

vérifier ces fonctions p>

similaire_text p>

Soundex P>

Levenshtein p>

IE P>

$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"


0 commentaires