PDA

Показать полную графическую версию : Сравнение строк в PHP


Dutchman Mihel
03-07-2004, 00:27
Нужно проверить строки на идентичность,
при этом учесть что при вводе могли быть допущены ошибки.
Например:

"Cadaveric Incubator Of Endoparasites" и
"Cadaveric inkubator Of endo-parasites"

также, как

"Ein Tröpfchen Voller Glück" и
"Ein Tropfchen Voller Gluck"

должны быть признаны идентичными.


Есть мысли как к этому подступиться?

Добавлено:

Ein Tröpfchen Voller Glück

это по-немецки там были o и u с точками  

FADE
03-07-2004, 03:40
ну например так

<?php

#-------------------------------------#
#--- правильная строка --------#
#-------------------------------------#
$a="Ein Trapfchen Voller Glock";

#-------------------------------------#
#--- не правильная строка ---#
#-------------------------------------#
$b="Ein Trepfchen Voller Gluck";

for ($i=0; $i<strlen($a); $i++)
{
$per=substr($a, $i)
if ($a[$i]==$per)
{
echo $per;
}
else
{
echo "<sup><font color=red>error has been into", $a[$i], "the miss was ok</font></sup>";
}
}

?>

вот такой вот скрипт от балды для примера)))
интересно заработает:biglaugh:

vadimiron
03-07-2004, 16:12
Многие из этих проблем можно решить с помощью регулярных выражений

Немного покапавшись в мануле нашёл ещё следущие интересные функции которые могут помочь при сравнение двух строк:
levenshtein
similar_text
strcspn

Vlad Drakula
03-07-2004, 22:34
Dutchman Mihel
все очень просто:

$a = ' "walk" the <b>dog</b> now';
$b = ' "walk" the <b>dog</b> now';

$c = html_entity_decode($a);

if( strcasecmp($b, $c) == 0 )
 print 'строки совпадают';
else
 print 'строки строки не совпадают';

(исходный строки - a и b)

FADE
прошу:
1) внимательно читать вопрос!
2) хоте бы проверять написанный вами код!

приведенный вами код не правильный сразу по трем причинам:
1) вызабыли переменную b, т.е. вы срасниваете a с a
2) если делать сравнивание то лучьше:

if( $a == $b )
...

3) этот код проверяет совершенно не так, как просил Dutchman Mihel

FADE
в селедующий раз прошу быть внимательнее или я вынесу вам предупреждение!!!

Dutchman Mihel
05-07-2004, 12:30
All

Похоже нужно пояснение к вопросу

Речь идет о поиске в хтмл файле по подстроке,
т.е. нет правильной строки и неправильной. Для случая полного соответствия я уже использовал strcasecmp - все пучком, работает. Нужно чтобы строки сопоставились как идентичные даже при НЕБОЛЬШОМ различии между ними (т.е. при наличии опечаток либо в тексте, либо в самой подстроке).

Хорошо то, что есть сигнатура по которой я могу искать нужный мне текст.

<FONT color=#dddddd><B>Нужный мне текст</B></Font>

Текст внутри этого font тега произвольной длины.

Плохо то, что нужного текста в файле может вообще не быть


vadimiron

Я уже смотрел в сторону levenshtein, но как ее здесь применить?

Функция считает кол-во операций для преобразования одной строки в другую.  Можно эмпирически определить предельно допустимое кол-во преобразований.  Для строки в 255 символов 8 операций выглядят не очень критичными. А для строки из 4 символов?

Добавлено:

Забыл сказать

этих штук

<FONT color=#dddddd><B>Нужный мне текст</B></Font>

в файле может быть от 1 и до чёрта

vadimiron
05-07-2004, 20:31
Dutchman Mihel
эта функция берёт каждый элемент строки и сравнивает его с таким же элементом по счёту другой строки, если не равны, то +1
В конце выдаётся сумма, то есть количество расхождений
Например
$a="asdfg";
$b="asdegh";
тогда
levenshtein ($a,$b);
будет равно 2
С одной стороны, если количество элементов в строках одинаковое, то эта функция может помочь, например если установить, что в строке из 20 элементов может быть не более 4 ошибок
Но с другой стороны значение слов: например Большой луг и Большой лук совершенно две разные строки, но эта функция выдаст всего лишь 1

Dutchman Mihel
05-07-2004, 23:03
vadimiron


эта функция берёт каждый элемент строки и сравнивает его с таким же элементом по счёту другой строки, если не равны, то +1

у левенштайна другой алгоритм

The Levenshtein distance is defined as the minimal number of characters you have to replace, insert or delete to transform str1 into str2.

но сути это не меняет. Результат выходит ненадежный.
Можно конечно бить строку по пробелу и анализировать среднюю отношений дистанции по левенштайну к длине слова, но это имхо тоже очень шатко.

vadimiron
06-07-2004, 00:02
у левенштайна другой алгоритм
не а почему, помоему такой и есть, он смотрит сколько надо сделать замен или удалений, чтобы вторую строку перевести в первую

А любое сравнение двух слов будет шатким :(, ведь подобные алгоритмы строятся в основном на сравнении элементов, которые входят в данные строки, отсюда следует, что упускается смысл слов-это и естественно, ещё не создали такой системы, которая смогла бы оперировать смыслом слов

А вариант, который был Владом предложен, не подходит??? Я просто так не пробывал, не знаю

Dutchman Mihel
06-07-2004, 13:04
vadimiron

упускается смысл слов

есть возможность сравнивать строки с помощью словарей ispell/aspell, но здесь это совершенно не подходит потому, что строка может быть на английском, русском, шведском, норвежском, немецком и черт знает каком еще языке, более того может ничего не значить ни на одном из них (это все названия песен :biggrin: )

вариант Влада позволяет определить было полное совпадение или нет, т.е. сам факт неравенства, а не насколько строки расходятся

Я его уже использовал для первоначальной проверки. Если все совпало, зачем бодаться со всякими levenshtein'ами  :) ?




© OSzone.net 2001-2012