Выделите условия поиска в PHP, не разрывая теги привязки с помощью регулярных выражений - PullRequest
0 голосов
/ 19 февраля 2010

Я просматриваю некоторые результаты поиска в базе данных на веб-сайте и пытаюсь выделить в возвращаемых результатах термин, соответствующий искомому термину. Ниже то, что у меня есть (в php):

$highlight = trim($highlight);
if(preg_match('|\b(' . $highlight . ')\b|i', $str_content))
{
    $str_content = preg_replace('|\b(' . $highlight. ')(?!["\'])|i', "<span class=\"highlight\">$1</span>", 
    $str_break;
}

Недостатком этого маршрута является то, что, если мой термин для поиска также отображается в постоянной ссылке url, возвращаемый результат вставит span в атрибут href и нарушит тег привязки. Есть ли в моем регулярном выражении какое-либо исключение "любой" информации из результатов поиска, которые появляются между открывающим и закрывающим тегом HTML?

Я знаю, что могу использовать функцию strip_tags () и просто выкладывать результаты в виде обычного текста, но я бы не стал этого делать, если бы мне не пришлось.

Ответы [ 3 ]

4 голосов
/ 19 февраля 2010

НЕ пытайтесь анализировать HTML с помощью регулярных выражений:
RegEx соответствует открытым тегам, кроме автономных тегов XHTML

Попробуйте что-то вроде PHP Простой HTML DOM .

<?php
// get DOM
$html = file_get_html('http://www.google.com/search?q=hello+kitty');

// ensure this is properly sanitized.
$term = trim($term);

// highlight $term in all <div class="result">...</div> elements
foreach($html->find('div.result') as $e){
   echo str_replace($term, '<span class="highlight">'.$term.'</span>', $e->plaintext);
}
?>

Примечание: это не точное решение, потому что я не знаю, как выглядит ваш HTML, но это должно приблизить вас к идее

0 голосов
/ 20 февраля 2010

В итоге я пошел по этому маршруту, который до сих пор хорошо работает в данной конкретной ситуации.

<?php

if(preg_match('|\b(' . $term . ')\b|i', $str_content))
{
    $str_content = strip_tags($str_content);
    $str_content = preg_replace('|\b(' . $term . ')(?!["\'])|i', "<span class=\"highlight\">$1</span>", $str_content);
    $str_content = preg_replace('|\n[^<]+|', '</p><p>', $str_content);
    break;
}

?>

Он по-прежнему закодирован в формате html, но теперь легче разобраться без тегов html

0 голосов
/ 19 февраля 2010

Я думаю, что утверждения это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...