dyluck Posted July 18, 2010 Share Posted July 18, 2010 Hi There, Trying to figure out the best function to display the closest match to a string. I have tried similar_text() and levenshtein() I wrote this myself and it doesn't seem to work well. function checksimilar( $word, $wordlist ) { foreach($wordlist as $value) { similar_text($word, $value, $percent); if($percent > .75) { $newstring[$value] = $percent; } else { $thekey = "No Close Suggestions"; $newstring[$thekey] = 1; } } asort($newstring); $key = key($newstring); return $key; } Tried this too, doesn't work very good either: function checksimilar( $word, $wordlist ) { $input = $word; // array of words to check against $words = $wordlist; // no shortest distance found, yet $shortest = -1; // loop through words to find the closest foreach ($words as $word) { // calculate the distance between the input word, // and the current word $lev = levenshtein($input, $word); // check for an exact match if ($lev == 0) { // closest word is this one (exact match) $closest = $word; $shortest = 0; // break out of the loop; we've found an exact match break; } // if this distance is less than the next found shortest // distance, OR if a next shortest word has not yet been found if ($lev <= $shortest || $shortest < 0) { // set the closest match, and shortest distance $closest = $word; $shortest = $lev; } } echo "Input word: $input\n"; if ($shortest <> 0) { return $closest; } //end checksimilar Here is example of what the comparrision is comparing: $word = GameFly_Online_Video_Game_Rentals-Rental_Product_Catalog.txt.gz $wordlist = array(GameSharkStore-Product_Catalog.txt.gz, GameFly_Online_Video_Games_Rentals-Rental_Product_Catalog2.txt.gz, Geeks_com-Product_Catalog_.txt.gz); I of course want it to suggest: GameFly_Online_Video_Games_Rentals-Rental_Product_Catalog2.txt.gz its slightly different then the original word but very close. Hope someone else has a better way of doing this! Link to comment https://forums.phpfreaks.com/topic/208118-finding-the-closest-match/ Share on other sites More sharing options...
TOA Posted July 18, 2010 Share Posted July 18, 2010 Regex (Regular Expression) also look into preg_match() here http://php.net/manual/en/function.preg-match.php probably you're best bet Link to comment https://forums.phpfreaks.com/topic/208118-finding-the-closest-match/#findComment-1087892 Share on other sites More sharing options...
dyluck Posted July 18, 2010 Author Share Posted July 18, 2010 I've used preg_match in other applications however not in this one. do you have a practical example? Link to comment https://forums.phpfreaks.com/topic/208118-finding-the-closest-match/#findComment-1087900 Share on other sites More sharing options...
AbraCadaver Posted July 18, 2010 Share Posted July 18, 2010 Change .75 to 75 and change asort() to arsort() and it will work as you expect. Link to comment https://forums.phpfreaks.com/topic/208118-finding-the-closest-match/#findComment-1087915 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.