PHP - возвращение ближайшего совпадения из базы данных - PullRequest
6 голосов
/ 08 июля 2011

Я возвращаю данные мобильного телефона на основе пользовательского агента. Но в случае, когда идентификатор пользователя не хранится (более новая версия телефона или программного обеспечения), я хочу иметь возможность вернуть самое близкое совпадение, что-то вроде того, как Google отображает «Вы имели в виду это». т.е.

если у меня есть хранимый пользовательский агент

Mozilla / 5.0 (Linux; U; Android 2,1-Update1; ан-п; Desire_A8181 Build / ERE27) AppleWebKit / 530.17 (KHTML, как Gecko) Версия / 4.0 Mobile Safari / 530,17

и пользовательский агент используется

Mozilla / 5.0 (Linux; U; Android 2,1-Update1; ан-п; Desire_G45H Build / ERE27) AppleWebKit / 530,17 (KHTML, как Gecko) Версия / 4.0 Mobile Safari / 530,17

Я хочу иметь возможность вернуть сохраненный файл, чтобы добавить или адаптировать мои данные соответствующим образом.

Кто-нибудь знает способ достижения этого?

Ответы [ 5 ]

4 голосов
/ 08 июля 2011

использовать полнотекстовый поиск с наиболее актуальными данными ...

SELECT * MATCH(browser) AGAINST ('your browser') AS score order by score DESC
2 голосов
/ 08 июля 2011

Обычный подход для нечеткого сопоставления строк - это такие вещи, как вычисление расстояния Левенштейна или его реализация в виде n-грамматического поискового индекса.Но для подходящих пользовательских агентов это излишне.

Скорее уменьшите искомую строку до определенных важных критериев, затем сделайте что-то вроде

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

Итак, вы удалите слишком подробные деталии замените их на% в вашем утверждении LIKE.Однако вам следует пересмотреть архитектуру - я бы сохранил только важные части и оставил без изменений точный номер сборки и т. Д. Также рассмотрите возможность использования внешней библиотеки, которая уже содержит пользовательские агенты и выполняет сопоставление для вас, не нужно заново изобретать колесо.

РЕДАКТИРОВАТЬ: так же, как VolkerK указал выше, «внешняя библиотека» должна быть PHPs getbrowser .Только что добавил для полноты ответа; -)

0 голосов
/ 08 июля 2011

Чтобы получить наилучший результат, вы можете извлечь целые записи и сделать цикл, чтобы угадать, кто является наиболее похожим словом

проверьте эти функции

SIMILAR_TEXT

SOUNDEX

Левенштейн

И.Е.

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

В любом случае, вы можете использовать полнотекстовый поиск mySQL, следуя некоторым рекомендациям, таким как this

0 голосов
/ 08 июля 2011

Использовать полнотекстовый поиск ;в противном случае эти функции могут помочь:

0 голосов
/ 08 июля 2011

Взгляните на один из сценариев на Выделите разницу между двумя строками в PHP , с некоторыми изменениями вы сможете получить процент от разницы.

...