- similar_text
- Parameters
- Return Values
- Examples
- See Also
- similar_text
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 11 notes
- Поиск похожей строки php
- Фильтрация данных с помощью zend-filter
- Контекстное экранирование с помощью zend-escaper
- Подключение Zend модулей к Expressive
- Совет: отправка информации в Google Analytics через API
- Подборка PHP песочниц
- Совет: активация отображения всех ошибок в PHP
similar_text
Это вычисляет сходство между двумя строками,как описано в разделе Классика программирования:Реализация Оливером лучших алгоритмов мира (ISBN 0-131-00413-1).Обратите внимание,что в этой реализации используется не стек,как в псевдокоде Оливера,а рекурсивные вызовы,которые могут как ускорить,так и не ускорить весь процесс.Обратите также внимание,что сложность данного алгоритма заключается в O(N**3),где N-длина самой длинной строки.
Parameters
Note:
Если поменять местами string1 и string2 может быть другим; см. пример ниже.
Передавая ссылку в качестве третьего аргумента, подобный_текст () вычислит схожесть в процентах, разделив результат подобного_текст () на среднее значение длин заданных строк, умноженное на 100 .
Return Values
Возвращает количество совпадающих символов в обеих строках.
Количество совпадающих символов вычисляется путем нахождения самой длинной общей подстроки,а затем рекурсивно для префиксов и суффиксов.Длины всех найденных общих подстрок добавляются.
Examples
Пример # 1 Пример подстановки аргументов Similar_text ()
В этом примере показано, что замена аргументов string1 и string2 может дать разные результаты.
$sim = similar_text('bafoobar', 'barfoo', $perc); echo "similarity: $sim ($perc %)\n"; $sim = similar_text('barfoo', 'bafoobar', $perc); echo "similarity: $sim ($perc %)\n";
Из приведенного выше примера будет выведено нечто подобное:
similarity: 5 (71.428571428571 %) similarity: 3 (42.857142857143 %)
See Also
- levenshtein () — Вычислить расстояние Левенштейна между двумя строками
- soundex () — Вычисляет ключ soundex строки
PHP 8.2
(PHP 4,5,7,8)show_source Псевдоним функции highlight_file()Эта функция является псевдонимом функции highlight_file().
(PHP 4,5,7,8)перетасовать массив Эта функция перетасовывает (изменяет в случайном порядке порядок элементов в)массив.
(PHP 5,7,8)simplexml_import_dom Получить объект SimpleXMLElement из узла Эта функция принимает узел документа DOM и превращает его в SimpleXML A DOM Element
(PHP 5,7,8)simplexml_load_file Интерпретирует объект в объект Преобразование хорошо сформированного XML-документа в заданном файле в объект.
similar_text
Вычисляет степень похожести двух строк по алгоритму, описанному в Programming Classics: Implementing the World’s Best Algorithms by Oliver (ISBN 0-131-00413-1). Эта реализация алгоритма не использует стека, использованного в оригинале, вместо этого применяются рекурсивные вызовы, что в некоторых случаях может ускорить процесс. Следует отметить, что сложность алгоритма составляет O(N**3), где N — длина более длинной из двух строк.
Список параметров
Замечание:
Изменение порядка string1 и string2 может привести к другому результату; см, пример ниже.
При передаче по ссылке третьего аргумента, similar_text() присваивает ему степень похожести двух строк в процентах, деля результат similar_text() на среднее число длин заданных строк 100 раз.
Возвращаемые значения
Возвращается количество совпадающих символов в двух строках.
Количество совпадающих символов вычисляется путём нахождения самой длинной первой общей подстроки, а затем делает это для префиксов и суффиксов рекурсивно. Добавляются длины всех найденных общих подстрок.
Примеры
Пример #1 Пример использования similar_text() с заменой аргументов
В этом примере показано, что изменение порядка аргументов string1 и string2 может дать разные результаты.
$sim = similar_text ( ‘bafoobar’ , ‘barfoo’ , $perc );
echo «сходство: $sim ( $perc %)\n» ;
$sim = similar_text ( ‘barfoo’ , ‘bafoobar’ , $perc );
echo «сходство: $sim ( $perc %)\n» ;?php
Результатом выполнения данного примера будет что-то подобное:
сходство: 5 (71.428571428571 %) сходство: 3 (42.857142857143 %)
Смотрите также
- levenshtein() — Вычисляет расстояние Левенштейна между двумя строками
- soundex() — Возвращает ключ soundex для строки
User Contributed Notes 11 notes
Be aware when using this function, that the order of passing the strings is very important if you want to calculate the percentage of similarity, in fact, altering the variables will give a very different result, example :
$var_1 = ‘PHP IS GREAT’ ;
$var_2 = ‘WITH MYSQL’ ;
similar_text ( $var_1 , $var_2 , $percent );
echo $percent ;
// 27.272727272727
similar_text ( $var_2 , $var_1 , $percent );
echo $percent ;
// 18.181818181818
?>
Please note that this function calculates a similarity of 0 (zero) for two empty strings.
similar_text ( «» , «» , $sim );
echo $sim ; // «0»
?>
Actually similar_text() is not bad.
it works good. But before processing i think is a good way to make a little mod like this
$var_1 = strtoupper(«doggy»);
$var_2 = strtoupper(«Dog»);
similar_text($var_1, $var_2, $percent);
echo $percent; // output is 75 but without strtoupper output is 50
Note that this function is case sensitive:
$var1 = ‘Hello’ ;
$var2 = ‘Hello’ ;
$var3 = ‘hello’ ;
echo similar_text ( $var1 , $var2 ); // 5
echo similar_text ( $var1 , $var3 ); // 4
Recursive algorithm usually is very elegant one. I found a way to get better precision without the recursion. Imagine two different (or same) length ribbons with letters on each. You simply shifting one ribbon to left till it matches the letter the first.
function similarity ( $str1 , $str2 ) $len1 = strlen ( $str1 );
$len2 = strlen ( $str2 );
$max = max ( $len1 , $len2 );
$similarity = $i = $j = 0 ;
return round ( $similarity / $max , 2 );
>
$str1 = ‘12345678901234567890’ ;
$str2 = ‘12345678991234567890’ ;
echo ‘Similarity: ‘ . ( similarity ( $str1 , $str2 ) * 100 ) . ‘%’ ;
?>
If performance is an issue, you may wish to use the levenshtein() function instead, which has a considerably better complexity of O(str1 * str2).
The speed issues for similar_text seem to be only an issue for long sections of text (>20000 chars).
I found a huge performance improvement in my application by just testing if the string to be tested was less than 20000 chars before calling similar_text.
20000+ took 3-5 secs to process, anything else (10000 and below) took a fraction of a second.
Fortunately for me, there was only a handful of instances with >20000 chars which I couldn’t get a comparison % for.
If you have reserved names in a database that you don’t want others to use, i find this to work pretty good.
I added strtoupper to the variables to validate typing only. Taking case into consideration will decrease similarity.
$query = mysql_query ( «select * from $table » ) or die( «Query failed» );
while ( $row = mysql_fetch_array ( $query )) <
similar_text ( strtoupper ( $_POST [ ‘name’ ]), strtoupper ( $row [ ‘reserved’ ]), $similarity_pst );
if ( number_format ( $similarity_pst , 0 ) > 90 ) <
$too_similar = $row [ ‘reserved’ ];
print «The name you entered is too similar the reserved name "» . $row [ ‘reserved’ ]. «"» ;
break;
>
>
?>
Well, as mentioned above the speed is O(N^3), i’ve done a longest common subsequence way that is O(m.n) where m and n are the length of str1 and str2, the result is a percentage and it seems to be exactly the same as similar_text percentage but with better performance. here’s the 3 functions i’m using..
function LCS_Length ( $s1 , $s2 )
<
$m = strlen ( $s1 );
$n = strlen ( $s2 );
//this table will be used to compute the LCS-Length, only 128 chars per string are considered
$LCS_Length_Table = array(array( 128 ),array( 128 ));
for ( $i = 1 ; $i for ( $j = 1 ; $j if ( $s1 [ $i — 1 ]== $s2 [ $j — 1 ])
$LCS_Length_Table [ $i ][ $j ] = $LCS_Length_Table [ $i — 1 ][ $j — 1 ] + 1 ;
else if ( $LCS_Length_Table [ $i — 1 ][ $j ] >= $LCS_Length_Table [ $i ][ $j — 1 ])
$LCS_Length_Table [ $i ][ $j ] = $LCS_Length_Table [ $i — 1 ][ $j ];
else
$LCS_Length_Table [ $i ][ $j ] = $LCS_Length_Table [ $i ][ $j — 1 ];
>
>
return $LCS_Length_Table [ $m ][ $n ];
>
function str_lcsfix ( $s )
<
$s = str_replace ( » » , «» , $s );
$s = ereg_replace ( «[��������]» , «e» , $s );
$s = ereg_replace ( «[������������]» , «a» , $s );
$s = ereg_replace ( «[��������]» , «i» , $s );
$s = ereg_replace ( «[���������]» , «o» , $s );
$s = ereg_replace ( «[��������]» , «u» , $s );
$s = ereg_replace ( «[�]» , «c» , $s );
return $s ;
>
function get_lcs ( $s1 , $s2 )
<
//ok, now replace all spaces with nothing
$s1 = strtolower ( str_lcsfix ( $s1 ));
$s2 = strtolower ( str_lcsfix ( $s2 ));
$lcs = LCS_Length ( $s1 , $s2 ); //longest common sub sequence
$ms = ( strlen ( $s1 ) + strlen ( $s2 )) / 2 ;
return (( $lcs * 100 )/ $ms );
>
?>
you can skip calling str_lcsfix if you don’t worry about accentuated characters and things like that or you can add up to it or modify it for faster performance, i think ereg is not the fastest way?
hope this helps.
Georges
To calculate the percentage of similarity between two strings without depending on the order of the parameters and be case insensitive, I use this function based on levenshtein’s distance:
// string similarity calculated using levenshtein
static function similarity ( $a , $b )
return 1 — ( levenshtein ( strtoupper ( $a ), strtoupper ( $b )) / max ( strlen ( $a ), strlen ( $b )));
>
?>
This will always return a number between 0 and 1, representing the percentage, for instance 0.8 represents 80% similar strings.
If you want this to be case-sensitive, just remove the strtoupper() functions.
Поиск похожей строки php
В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Совет: активация отображения всех ошибок в PHP
При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.