метод сравнения строк в php

Я хочу сравнить две строки и вернуться к уровню сравнения.

Строка 1 является входной и может поступать в разных форматах от клиентов. Например:

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

Строка 2 – это строка, с которой я хочу сравнить ее. Например:

 string 2 - "English Language" 

Я понимаю, что я могу использовать preg_match для поиска точного шаблона:

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

Но есть ли метод, который вернет фактор соответствия, а не просто да или нет? Я понимаю, что может быть более сложный ответ на кодирование с использованием метода типа preg_match но мне интересно, есть ли что-то уже вокруг, которого я не нашел.

Вы можете использовать levenshtein() :

Расстояние Левенштейна определяется как минимальное количество символов, которые вы должны заменить, вставить или удалить, чтобы преобразовать str1 в str2. Сложность алгоритма O (m * n), где n и m – длина str1 и str2 (довольно хорошая по сравнению с аналогичным_text (), которая равна O (max (n, m) ** 3), но еще дорогой).

Например, расстояние Левенштейна для «английского языка» и «GCSE English Lang Year 10» составляет 12.

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

У вас есть большая часть того, что вам нужно. Вам нужно зафиксировать совпадение, которое вы нашли, а затем вы можете использовать levenshtein, чтобы узнать, насколько он отличается от полного слова.

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

Теперь max $ diff будет: max(strlen($match), strlen('english')); , Если вы установите $ max на максимальную разницу, то подобие от 0 до 100 будет 100*($max-$diff)/$max; – Но я советую вам этого не делать. Это плохая метрика. Придерживайтесь $ diff и ищите самый низкий $ diff.

Возможно, что-то вроде:

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

который вычисляет процент идентичных слов в двух строках, хотя он не позволяет аббревиатуру от English до English