Подсветка поисковых запросов

Тема в разделе "Как сделать...", создана пользователем Wertos, 22 дек 2015.

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

    Wertos Постоялец

    Регистр.:
    13 апр 2007
    Сообщения:
    145
    Симпатии:
    27
    Функция подсветки слов в тексте...
    PHP:
    function getHighlightedText($text$query$bold=false)
    {
            if(!
    $query || !$text) return $text;

            
    $words explode(' '$query);

            foreach(
    $words as $word)
            {
                
    $word strip_tags(strtolower(trim(urldecode($word))));
                if (
    strlen($word) < 2) { continue; }
                if (
    strlen($word) == 2) { $queryes[] = $word; continue; }
                
    $queryes[] = $word;
            }
            unset(
    $word);
            foreach (
    $queryes as $word)
            {
          
    $word preg_replace('![^\w\d\s]*!','',$word);
          
    $b = ($bold) ? ' class="bold" ' '';
          
    $pattern "~(".$word.")~i";
              
    $replace '<span style="color:#DD6900;"'.$b.'>$1</span>';
              
    $text preg_replace($pattern$replace$text);
            }
            return 
    $text;
    }
    Но если учесть что она обрабатывает HTML, то появляется проблема со ссылками, а именно
    поисковое слово "microsoft" в данной ссылке
    <a href="microsoft.com">xxxxx</a>
    портит весь код ((
    Есть какой нибудь вариант исправить это ?
    Например исключить из замены, то что находиться между =" и " ?
     
  2. Rupper

    Rupper Постоялец

    Регистр.:
    24 авг 2010
    Сообщения:
    125
    Симпатии:
    78
    а где у вас тут "href" ? если у вас создается тут ссылка, то вы должны по идеи поставить "style" именно для ссылки и тогда должно быть все ок
     
  3. Wertos

    Wertos Постоялец

    Регистр.:
    13 апр 2007
    Сообщения:
    145
    Симпатии:
    27
    Не создаётся ссылка, в html коде например, который попадает в $text есть ссылка с href, в котором имеется слово $query и тогда получиться
    <a href="<span style="color:#DD6900;">microsoft</span>.com">xxxxx</a> это будет если $query = microsoft
     
  4. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    194
    Симпатии:
    235
    А если полностью пропускать HTML теги?
    PHP:
    $pattern "~(".$word.")~i";
    Предлагаю поменять это шаблон на такой
    PHP:
    $pattern "~\G(?:<[^>]*>|(?!$word).)*+\K$word~i";
     
    Wertos нравится это.
  5. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    244
  6. Wertos

    Wertos Постоялец

    Регистр.:
    13 апр 2007
    Сообщения:
    145
    Симпатии:
    27
    теперь microsoft в href оно, не трогает, а то что в тексте вырезает...
     
  7. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    194
    Симпатии:
    235
    Скобки забыл :) \K($word)
    PHP:
    $pattern "~\G(?:<[^>]*>|(?!$word).)*+\K($word)~i";
     
    Wertos нравится это.
  8. Wertos

    Wertos Постоялец

    Регистр.:
    13 апр 2007
    Сообщения:
    145
    Симпатии:
    27
    Отлично работает ! Вопрос можно считать закрытым.
     
Статус темы:
Закрыта.