Как проверить частичное сходство двух строк в PHP

Является ли какая-либо функция в PHP проверкой% сходства двух строк?

Например, у меня есть:

$string1="Hello how are you doing" $string2= " hi, how are you" 

и function($string1, $string2) вернет мне true, потому что в строке присутствуют слова «как», «есть», «вы».

Или даже лучше, верните мне 60% подобия, потому что «как», «есть», «вы» – это 3/5 $string1 .

Существует ли какая-либо функция в PHP, которая это делает?

Поскольку это хороший вопрос, я прилагал к нему некоторые усилия:

 <?php $string1="Hello how are you doing"; $string2= " hi, how are you"; echo 'Compare result: ' . compareStrings($string1, $string2) . '%'; //60% function compareStrings($s1, $s2) { //one is empty, so no result if (strlen($s1)==0 || strlen($s2)==0) { return 0; } //replace none alphanumeric charactors //i left - in case its used to combine words $s1clean = preg_replace("/[^A-Za-z0-9-]/", ' ', $s1); $s2clean = preg_replace("/[^A-Za-z0-9-]/", ' ', $s2); //remove double spaces while (strpos($s1clean, " ")!==false) { $s1clean = str_replace(" ", " ", $s1clean); } while (strpos($s2clean, " ")!==false) { $s2clean = str_replace(" ", " ", $s2clean); } //create arrays $ar1 = explode(" ",$s1clean); $ar2 = explode(" ",$s2clean); $l1 = count($ar1); $l2 = count($ar2); //flip the arrays if needed so ar1 is always largest. if ($l2>$l1) { $t = $ar2; $ar2 = $ar1; $ar1 = $t; } //flip array 2, to make the words the keys $ar2 = array_flip($ar2); $maxwords = max($l1, $l2); $matches = 0; //find matching words foreach($ar1 as $word) { if (array_key_exists($word, $ar2)) $matches++; } return ($matches / $maxwords) * 100; } ?> 

Как уже говорили другие ответы, вы можете использовать подобный_текст. Вот демонстрация:

 $string1="Hello how are you doing" ; $string2= " hi, how are you"; echo similar_text($string1, $string2, $perc); //12 echo $perc; //61.538461538462 

вернет 12, и установит в $ perc процент сходства, о котором вы просили.

В дополнение к ответу Алекса Сири и в соответствии со следующей статьей:

http://docstore.mik.ua/orelly/webprog/php/ch04_06.htm

PHP предоставляет несколько функций, которые позволяют проверить, являются ли две строки приблизительно равными:

 $string1="Hello how are you doing" ; $string2= " hi, how are you"; 

SOUNDEX

 if (soundex($string1) == soundex($string2)) { echo "similar"; } else { echo "not similar"; } 

Metaphone

 if (metaphone($string1) == metaphone($string2)) { echo "similar"; } else { echo "not similar"; } 

СХОДНЫЙ ТЕКСТ

 $similarity = similar_text($string1, $string2); 

Левенштейн

 $similarity = levenshtein($string1, $string2); 

Хорошо, вот моя функция, которая делает ее очень интересной.

Я проверяю примерно сходство строк.

Вот критерий, который я использую для этого.

  1. Порядок слов важен
  2. Слова могут иметь 85% сходства.

Пример:

 $string1 = "How much will it cost to me" (string in vocabulary) $string2 = "How much does costs it " //("costs" instead "cost" -is a mistake) (user input); 

Алгоритм: 1) Проверьте сходство слов и создайте чистые строки с «правильными» словами (в порядке, указанном в лексике). OUTPUT: «сколько это стоит» 2) создать чистую строку с «правильными словами», чтобы она отображалась в пользовательском вводе. OUTPUT: «сколько стоит» 3) Сравните два выхода – если не то же самое – верните no, else, если они вернутся да.

 error_reporting(E_ALL); ini_set('display_errors', true); $string1="сколько это стоит ваще" ; $string2= "сколько будет стоить это будет мне"; if(compareStrings($string1, $string2)) { echo "yes"; } else { echo 'no'; } //echo compareStrings($string1, $string2); function compareStrings($s1, $s2) { if (strlen($s1)==0 || strlen($s2)==0) { return 0; } while (strpos($s1, " ")!==false) { $s1 = str_replace(" ", " ", $s1); } while (strpos($s2, " ")!==false) { $s2 = str_replace(" ", " ", $s2); } $ar1 = explode(" ",$s1); $ar2 = explode(" ",$s2); // $array1 = array_flip($ar1); // $array2 = array_flip($ar2); $l1 = count($ar1); $l2 = count($ar2); $meaning=""; $rightorder=""; $compare=0; for ($i=0;$i<$l1;$i++) { for ($j=0;$j<$l2;$j++) { $compare = (similar_text($ar1[$i],$ar2[$j],$percent)) ; // echo $compare; if ($percent>=85) { $meaning=$meaning." ".$ar1[$i]; $rightorder=$rightorder." ".$ar1[$j]; $compare=0; } } } //print_r($rightorder); if ($rightorder==$meaning) { return true; } else { return false; } } 

я хотел бы услышать ваше мнение и предложение о том, как его улучшить

Вы можете использовать функцию PHP similar_text .

 int similar_text ( string $first , string $second) 

Проверьте документ PHP по адресу: http://php.net/manual/en/function.similar-text.php