Является ли какая-либо функция в 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);
Хорошо, вот моя функция, которая делает ее очень интересной.
Я проверяю примерно сходство строк.
Вот критерий, который я использую для этого.
Пример:
$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