Considérer ce qui suit. J'ai un très grand tableau avec tous les noms de routes dans un pays donné, classés par longueur de chaîne comme ceci:

$roadNames = ['Ivy Lane','East Road','The Maltings','Greenhill Road', 'Woodlands Close']; //And many, many more

Maintenant, je veux chercher une correspondance exacte dans une longue chaîne

$string = "
..... ALOT OF TEXT ..... 
..... ALOT OF TEXT ..... 

You can find us at: Greenhill Road 1, 11111, The City 

..... ALOT OF TEXT .....
..... ALOT OF TEXT ..... 
";

Pour trouver une correspondance exacte, la sorcière est assez facile, je fais juste ce qui suit:

foreach ($roadNames as $roadName) {
    if(stripos($string, $roadName) !== false){
        echo 'Exact match: '.$roadName;
        break;
    }
}

Mais que faire si le nom de la route est mal orthographié par 1 lettre, fx. un espace supplémentaire / un espace est manquant, une lettre moins / plus ou 1 lettre est incorrecte. Fx. "Greenhil Road", "Greenhilll Road", "GreenhillRoad", "Green hill Road", "Creenhill Road"? Comment puis-je maintenant trouver la meilleure correspondance de tous mes noms de route dans le tableau si le nom de la route dans la chaîne $ était l'un des exemples? Y a-t-il un moyen mathématique de le faire? Ou peut-être que je peux acheter un regex?

Je pense à quelque chose comme ça, même si cela semble exagéré (et ne fonctionne pas)

foreach ($roadNames as $roadName) {
    if (stripos($string, $roadName)) {
        echo 'Exact match: ' . $roadName;
        break;
    } else {
        $alphabet = range('a', 'z');
        $alphabet[] = ' ';
        $roadName_split = str_split($roadName);
        $test_array = array();
        foreach ($roadName_split as $strpos => $letter) {
            foreach ($alphabet as $letter_in_alphabet) {
                $test_array[] = $letter_in_alphabet;
            }
            foreach ($test_array as $key => $value) {
                $test_array[$key] .= substr($roadName, $strpos, 1);
            }
        }
        echo '<pre>';
        print_r($test_array);
        echo '</pre>';
        die;
        foreach ($test_array as $misplled_value) {
            if (stripos($string, $misplled_value)) {
                echo 'close match found: ' . $roadName;
                break;
            }
        }
//        OR Some kind of a regex, dont know how it should be
//        $roadName_split = str_split($roadName);
//        $re = '';
//        foreach ($roadName_split as $strpos => $letter) {
//            $re .= "$letter?";
//        }
    }
}
0
user2192013 14 janv. 2020 à 00:50