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 p>
Si j'ai un utilisateur stocké de p>
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 P> blockQuote>
et l'agent utilisateur utilisé est p>
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 P> blockQuote>
Je veux pouvoir retourner celui stocké pour ajouter ou adapter mes données en conséquence. P>
Est-ce que quelqu'un connaît une façon de réaliser cela? p>
5 Réponses :
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. P>
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
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 p> 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. P> 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; -) p> p>
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
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
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
utiliser Recherche en texte intégral ; Sinon, ces fonctions peuvent aider: p>
similaire_text () code>
li>
Levenshtein () code>
li>
ul> 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.
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>
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"
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.