2011-07-08 13 views
6

Powracam dane telefonu komórkowego na podstawie klienta użytkownika. Ale w przypadku, gdy użytkownik nie jest przechowywany (nowsza wersja telefonu lub oprogramowania), chcę móc zwrócić najbliższy odpowiednik, trochę tak, jak Google wyświetla "czy masz na myśli to". tjPHP - powracający najbliżej z bazy danych

jeśli mam zapisaną useragent z

Mozilla/5.0 (Linux; U; Android 2,1-update1, PL-NL; Desire_A8181 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Wersja/4.0 Telefon Safari/530,17

a agent jest w użyciu

Mozilla/5,0 (Linux; U; Andre oid 2.1-aktualizacja1; en-nl; Desire_G45H Build/ERE27) AppleWebKit/530,17 (KHTML, like Gecko) Version/4.0 Komórka Safari/530,17

Chcę być w stanie powrócić jeden przechowywane dodać lub dostosować moich danych odpowiednio.

Czy ktoś zna sposób osiągnięcia tego?

+0

Jeśli chcesz rozwijać swój własny system, który dobrze przeze mnie, ale .... Czy przyjrzeć http : //docs.php.net/function.get_browser i zazwyczaj szybsza niż w świetle aktualizacja browscap.ini na http://browsers.garykeith.com/downloads.asp? – VolkerK

+0

Jeśli chcesz się tym zająć tylko na poziomie bazy danych, powinieneś usunąć znacznik php. – Stijn

Odpowiedz

0

Spójrz na jeden ze skryptów na Highlight the difference between two strings in PHP, z pewnymi modyfikacjami powinieneś być w stanie uzyskać procent różnicy.

+0

To dwa ciągi, mógłbym napisać własną funkcję do tego lub użyć levenshtein(), ale jest to kwestia wydajności sql i zastanawiałem się, czy istnieje odpowiednik sql –

2

Typowym podejściem do dopasowywania ciągów rozmytych są takie rzeczy, jak obliczanie odległości levenshtein lub wdrażanie jej jako n-gramowego indeksu wyszukiwania. Ale w przypadku dopasowywania programów klienckich jest to przesada.

raczej zmniejszyć ciąg poszukiwania do pewnych ważnych criterias, a następnie zrobić coś podobnego

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

Więc pozbawić pewnych zbyt szczegółowe części i zastąpić je przez% w LIKE oświadczenie. Powinieneś jednak zastanowić się nad architekturą - zachowałbym tylko ważne części i pominąłem dokładny numer kompilacji. Rozważ także użycie zewnętrznej biblioteki, która zawiera już programy użytkownika i czy pasuje do ciebie, bez potrzeby ponownego odkrywania koła.

EDYCJA: tak jak VolkerK wskazał powyżej, "biblioteka zewnętrzna" powinna być PHPs getbrowser. Po prostu dodano dla złożoności odpowiedź ;-)

+0

Mam bazę danych 6.549 urządzeń mobilnych z wieloma agentami użytkownika przeciwko nie wymyślam ponownie koła, tylko wygładzam krawędzie. Dzięki za powyższą metodę, spróbuj. Pozdrowienia –

+0

Aby się upewnić: znasz http://wurfl.sourceforge.net/? –

4

użyć wyszukiwania pełnotekstowego z najbardziej istotnych danych ...

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

ciekawe, musiałbym użyć limitu, choć prawe, ponieważ nadal zwrócił wszystkie wyniki tylko w porządku? Będzie wyzywająco spojrzeć w to. –

+0

Należy jednak pamiętać, że indeks pełnotekstowy MySQL jest bestią z pewnymi problemami - na przykład, minimalna długość słowa to 4 znaki: w "530.17" automatycznie ignorowałaby część ".17". Również najbliższe kryteria dopasowania są trochę wadliwe. Działa dobrze w przypadku tekstów naturalnych, ale może nie dla programów użytkownika. –

+0

możesz zmienić minimalną długość słowa i wyłączyć stopwords, które są jeszcze większym bólem. zobacz http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html – sgroves

0

Aby uzyskać najlepszy rezultat, można wyodrębnić całe rekordy i zrobić cykl odgadnąć, kto jest najbardziej podobny wyraz

sprawdź te funkcje:

SIMILAR_TEXT

SOUNDEX

LEVENSHTEIN

CZYLI

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

W każdym razie, można użyć mysql Fulltext-wyszukiwanie po kilka wskazówek jak this one