1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

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

Тема в разделе "Web Coding", создана пользователем red_heads, 27 дек 2007.

Статус темы:
Закрыта.
Модераторы: latteo
  1. red_heads

    red_heads

    Регистр.:
    30 янв 2007
    Сообщения:
    157
    Симпатии:
    26
    Как сравнить две строковые переменные,

    я знаю как сделать когда две переменные полностью идентичны, а
    как сравнить вот такие две строки и в результате получить истину, т.е. что обе строки являются названием одного и того же товара, но написаны они по разному и иногда некоторые слова отличаются
    пример
    Плата 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% то значит они одинаковы
    но ват какие фукции применить и и как это сделать не знаю


    как сравнивать их если в базе лежат еще товары с похожими названиями
     
  2. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    На слова можно разбить так: $words = explode(' ',$subj);
    Потом уж сам :)
     
  3. Karlasan

    Karlasan Постоялец

    Регистр.:
    7 дек 2007
    Сообщения:
    131
    Симпатии:
    204
    Подойдет ли similar_text() - думаю стоит оценить самому. Сравни несколько похожих и непохожих строк, посмотри какие будут результаты.
    Ещё функция для сравнения строк:
    Перейти по ссылке

    А по хорошему - надо бы хранить в базе названия товаров в определенном формате, например: "тип изделия (видюха, мама, звуковуха и т.п.), производитель, модель, характеристики". И если потом понадобится найти гигабайтовские видюхи GF 8500GT - проблем при поиске будет меньше.
     
  4. lobzik

    lobzik

    Регистр.:
    8 авг 2006
    Сообщения:
    311
    Симпатии:
    49
    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 ;
     
  5. Karlasan

    Karlasan Постоялец

    Регистр.:
    7 дек 2007
    Сообщения:
    131
    Симпатии:
    204
    насколько я понял - имеется база товаров, и требуется по запросу вывести похожие названия.
    если юзать функции для сравнения строк - необходимо выбирать все записи из базы, затем сравнивать введенный запрос с каждой записью - слишком избыточно.
     
  6. Trezub

    Trezub Создатель

    Регистр.:
    27 дек 2007
    Сообщения:
    16
    Симпатии:
    0
    а что если пхп-шную функцию strnatcmp использовать?

    "естественное" сравнение строк.
     
  7. skabbit

    skabbit Постоялец

    Регистр.:
    6 дек 2007
    Сообщения:
    88
    Симпатии:
    1
    по-моему в данном случае надо найти (напарсить с какого-либо интернет-магазина) базку точных однословных идентификаторов продуктов - тут это GV-NX85T256H.
    далее, если в обоих строках есть один и тот же идентификатор - значит и продукт совпадает.
     
  8. mentanos

    mentanos Постоялец

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

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

    red_heads

    Регистр.:
    30 янв 2007
    Сообщения:
    157
    Симпатии:
    26
    в том то и дело что именно нужно сравнивать
    т.к. прайс формирутется имеенно такой и другого пока нету

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

    Добавлено через 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++;
    }
     
  10. zavulon

    zavulon Постоялец

    Регистр.:
    9 май 2007
    Сообщения:
    79
    Симпатии:
    34
    вот написал. оно?

    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) .'%');

     
Статус темы:
Закрыта.