Выделение условий поиска - PullRequest
0 голосов
/ 10 апреля 2009

У меня есть случай, когда я возвращаю результаты базы данных и отображаю их на странице на основе поискового запроса. Эта часть работает нормально, но я хочу выделить эти условия поиска, обернув их в теги span. Я начал писать функцию, которую вызывал для каждого результата, в котором использовалась функция str_replace, но потом до меня дошло, что это также повлияет на любой текст в тегах HTML. У кого-нибудь есть функция, которую они используют, чтобы сделать это эффективно? Я использую PHP 4. Спасибо!

Ответы [ 3 ]

3 голосов
/ 11 апреля 2009

Я бы пошел на подсветку с помощью JavaScript

http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html

$(document).ready(function(){
$('#your_results_list').removeHighlight().highlight('search_word');
}

таким образом вы не будете связываться с источником, пользователь может включить подсветку, если хотите, и т. Д.

2 голосов
/ 10 апреля 2009

Я однажды написал поиск в Perl, сделал это так (сделал небольшой перевод на PHP):

// Split up the full page content in pieces without `<` and `>`
preg_match_all("/([^<>]+)/", $pageContent, $matches);
foreach ($matches as $val) {
    // Just print the $val if it was between < and >
    if (preg_match("/<$val>/", $pageContent) { print "<$val>"; }
    else {
       // Do the replace
       print str_replace( "$searchString", "<span>$searchString</span>", $val);
   }
}

Вы можете избежать использования регулярных выражений, если:

 // Split up the full page content in pieces with `<`
 $matches = split("<", $pageContent);
 foreach ($matches as $val) {
    // Just print the $val if it was between < and >
    if (stristr($pageContent, "<$val")) { print "<$val"; }
    else {
       // Do the replace
       print str_replace( "$searchString", "<span>$searchString</span>", $val);
   }
}

Не проверял, но должно быть что-то вроде этого.

0 голосов
/ 10 апреля 2009

Если вы возвращаете результаты и , отображающие их, то не должны ли вы иметь доступ к необработанным данным до того, как они появятся в html? Если это так, то внесите изменения в необработанные данные, добавив туда теги span.

Если вы говорите, что ваши необработанные данные могут уже содержать html, вы можете использовать регулярное выражение, чтобы определить, находитесь ли вы внутри html-тега, и использовать preg_replace вместо str_replace.

Другие опции:

- загрузить результаты в синтаксический анализатор dom и выполнять операции замены только на конечных текстовых узлах

- напишите свой собственный анализатор, чтобы отслеживать, если вы находитесь внутри HTML-тега или нет

- вытащить все HTML-теги из ваших результатов, поместить в качестве заполнителей, как «[[[tag1]]] balha blah blah [[[tag2]]]», затем замените оставшийся текст, а затем замените ваши теги обратно в

...