Как сравнить две строковые переменные?

Статус
В этой теме нельзя размещать новые ответы.

red_heads

Знаток
Регистрация
30 Янв 2007
Сообщения
176
Реакции
29
Как сравнить две строковые переменные,

я знаю как сделать когда две переменные полностью идентичны, а
как сравнить вот такие две строки и в результате получить истину, т.е. что обе строки являются названием одного и того же товара, но написаны они по разному и иногда некоторые слова отличаются
пример
Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM

и
PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT


Подайжет ли да этого функция similar_text()

нужно наверное разбить строку и сравнить каждое слово и если соответветсвие больше 80% то значит они одинаковы
но ват какие фукции применить и и как это сделать не знаю


как сравнивать их если в базе лежат еще товары с похожими названиями
 
На слова можно разбить так: $words = explode(' ',$subj);
Потом уж сам :)
 
Подойдет ли similar_text() - думаю стоит оценить самому. Сравни несколько похожих и непохожих строк, посмотри какие будут результаты.
Ещё функция для сравнения строк:
Для просмотра ссылки Войди или Зарегистрируйся

А по хорошему - надо бы хранить в базе названия товаров в определенном формате, например: "тип изделия (видюха, мама, звуковуха и т.п.), производитель, модель, характеристики". И если потом понадобится найти гигабайтовские видюхи GF 8500GT - проблем при поиске будет меньше.
 
PHP:
similar_text('SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM', 'PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT', $percents);
echo "<br>\nПроценты: ";
echo   $percents ;
 
насколько я понял - имеется база товаров, и требуется по запросу вывести похожие названия.
если юзать функции для сравнения строк - необходимо выбирать все записи из базы, затем сравнивать введенный запрос с каждой записью - слишком избыточно.
 
а что если пхп-шную функцию strnatcmp использовать?

"естественное" сравнение строк.
 
по-моему в данном случае надо найти (напарсить с какого-либо интернет-магазина) базку точных однословных идентификаторов продуктов - тут это GV-NX85T256H.
далее, если в обоих строках есть один и тот же идентификатор - значит и продукт совпадает.
 
В строках того вида, что ты привел, код продукта (GV-NX85T256H) заведомо отличается от всех других слов в строке. Напиши регулярное выражение для вытягивания кода из строки и на основе ее функцию getIdFromTitle($s). Тогда сравнение двух строк на идентичность будет выглядеть просто как
getIdFromTitle($s1)===getIdFromTitle($s2).

А лучше использовать эту функцию, чтобы переработать базу - добавить в описание продукта поле КОД, который заполнить с помощью этой функции, а из описаний продуктов коды убрать.
 
в том то и дело что именно нужно сравнивать
т.к. прайс формирутется имеенно такой и другого пока нету

это и так ясно что проще что б названия совпадали, ну если не подходит такой вариант
поставщик дает прайс в таком виде и его обновлять надо постоянно поэтому названия изменять не могу

Добавлено через 15 минут
впринципе мне вроде как подходит similar_text
только вот не знаю как это все оформлять нужно найти максимальные проценты, а затем вывести данный элемент

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

не знаю как мне переделать теперь под эту функцию код

foreach ( $products as $prd ) {
if ( !is_work() ) {
message( 'Бот остановлен!</b>' );
break;
}
message( 'Проверка существования прд.:<b>' . $prd['name'] . '</b>' );

$prd['name'] = preg_replace( '`([\.\|\?\+\*\$\^\(\)\[\]\-])`si', '\\\$1' ,$prd['name'] );



//Если товар не найден
if ( !preg_match( '`<a href="([^"]+)">' . $prd['name'] . '</a>`si' , $main_page, $url ) ) {
message( '.&nbsp;<font color="red">Ненайдено!</font><br>' );
continue;
}
$founded++;



message( '.&nbsp;<font color="blue">Найдено! Берем страницу! <a href="' . $url[1] . '" target="_blank">Страница продукта</a></font><br>');

//Берем описание товара!
$desc = GetPage( $url[1] );

if ( !preg_match( '`<p><b></b></p> <p>(.+?)</p></td></tr>`si', $desc, $pp ) ) {
message( '<font color="red">Нет описания!</font><br>' );
continue;
}

$sql = 'UPDATE `' . $cfg['PROD_TABLE_NAME'] . '` SET description= \'' . mysql_escape_string( $pp[1] ) . '\' WHERE productID = ' . intval( $prd['productID'] );

$res = mysql_query( $sql, $cfg['dbi'] );

if ( mysql_error( $cfg['dbi'] ) != '' )
continue;
message( '<font color="blue">Обновление произведено!</font><br>');
$added++;
}
 
вот написал. оно?

PHP:
function compareStrings($s1, $s2) {
	$commonWords = array(' ', ',', '.', 'mb', 'kb'); // add more
	
	$s1 = trim(strtolower($s1));
	$s2 = trim(strtolower($s2));
	
	$a1 = array_diff(array_unique(explode(' ', $s1)), $commonWords); // exclude common words
	$a2 = array_diff(array_unique(explode(' ', $s2)), $commonWords); // exclude common words
	$wordCount = (count($a1)+count($a2))/2;
	
	$intersect = array_intersect($a1, $a2); // found same words
	
	return count($intersect) / $wordCount; // 0.8 means 80% of same words
}

$s1 = 'Плата SVGA Gigabyte PCI-E GV-NX85T256H GF 8500GT 256Mb DDR2 DVI TV-Out OEM';

$s2 = 'PCI-E DDR-2 Gigabyte GV-NX85T256H DVI SLI GeForce 8500GT';

echo('Вероятность: '.  (compareStrings($s1,$s2)*100) .'%');
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху