método para comparar cadenas en php

Quiero comparar dos cadenas y devolver un nivel de comparación.

String 1 es la entrada y puede venir en una variedad de formatos de clientes. Por ejemplo:

string 1 - "GCSE English Lang Year 10" or string 1 - "Year 10 Eng Lang GCSE" etc 

String 2 es la cadena con la que quiero compararlo. Por ejemplo:

 string 2 - "English Language" 

Me doy cuenta de que puedo usar preg_match para buscar un patrón exacto:

 $subject = $inputString; $pattern= "/Eng/"; if (preg_match($pattern, $inputString)) { echo "match"; } 

¿Pero hay un método que devolverá un factor de coincidencia, en lugar de simplemente sí o no? Me doy cuenta de que puede haber una respuesta de encoding más compleja utilizando el método de tipo preg_match , pero me pregunto si ya he encontrado algo que no he encontrado.

Puede usar la función levenshtein() :

La distancia de Levenshtein se define como la cantidad mínima de caracteres que tiene que reemplazar, insertar o eliminar para transformar str1 en str2. La complejidad del algoritmo es O (m * n), donde n y m son la longitud de str1 y str2 (bastante bueno en comparación con similar_text (), que es O (max (n, m) ** 3), pero sigue siendo caro).

Por ejemplo, la distancia de Levenshtein para “English Language” y “GCSE English Lang Year 10” es 12.

 $lev = levenshtein('GCSE English Lang Year 10', 'English Language'); echo $lev; // 12 

Tienes la mayor parte de lo que necesitas. Debes capturar el fósforo que encontraste y luego puedes usar levenshtein para ver qué tan diferente es de la palabra completa.

 $subject = $inputString; $pattern= "/Eng[a-zA-Z]+/"; // I made it clear that I want all letters in the word. $matches = array(); // This is an array of all the words that match. if (preg_match($pattern, $inputString, $matches)) { $match = $matches[0]; // Check first match - assume only one matched. $diff = levenshtein(strtolower($match), 'english'); print "Found $match which is $diff edits from English.\n"; } 

Ahora, el max $ diff será: max(strlen($match), strlen('english')); . Si establece $ max a la diferencia máxima, la similitud de 0 a 100 sería 100*($max-$diff)/$max; – pero te aconsejo que no hagas eso. Es una métrica pobre. Quédate con $ diff y busca el $ diff más bajo.

Quizás algo como:

 $string1 = "GCSE English Lang Year 10"; $string2 = "Year 10 Eng Lang GCSE"; $i = array_intersect( str_word_count(strtolower($string1), 2), str_word_count(strtolower($string2), 2) ); $similarityPercentage = count($i) / max(count($array1), count($array2)) * 100; 

que calcula el porcentaje de palabras idénticas en las dos cadenas, aunque no permite la abreviatura de English a Eng