Как проверить частичное сходство двух строк в PHP
Является ли какой-либо функцией в PHP проверкой% сходства двух строк?
Например, у меня есть:
$string1="Hello how are you doing"
$string2= " hi, how are you"
и function($string1, $string2)
вернет меня true, потому что в строке присутствуют слова "как", "есть", "вы".
Или даже лучше, верните мне 60% подобия, потому что "как", "есть", "вы" - это 3/5 из $string1
.
Есть ли какая-нибудь функция в PHP, которая это делает?
Ответы
Ответ 1
Как хороший вопрос, я вложил в это несколько усилий:
<?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;
}
?>
Ответ 2
Как уже говорили другие ответы, вы можете использовать аналогичный_текст.
Здесь демонстрация:
$string1="Hello how are you doing" ;
$string2= " hi, how are you";
echo similar_text($string1, $string2, $perc); //12
echo $perc; //61.538461538462
вернет 12 и установит в $perc процент сходства, о котором вы просили.
Ответ 3
В дополнение к Алексу Сири ответьте и согласно следующей статье:
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);
Левенштейн
$distance = levenshtein($string1, $string2);
Ответ 4
Хорошо, вот моя функция, которая делает ее очень интересной.
Я проверяю приблизительно сходство строк.
Вот критерий, который я использую для этого.
- Порядок слов важен.
- Слова могут иметь 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;
}
}
Мне бы хотелось услышать ваше мнение и предложение, как улучшить его.
Ответ 5
Вы можете использовать функцию PHP similar_text
.
int similar_text ( string $first , string $second)
Проверьте документ PHP по адресу http://php.net/manual/en/function.similar-text.php