как найти подстроку в текстовой строке и выделить ее все - PullRequest
3 голосов
/ 15 ноября 2008

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

Так что, если $ term является "крутым", preg_replace должно закончиться с:

<div><span style="background: #f00">My hair cut so cool!</span></div>

К сожалению, мое регулярное выражение, кажется, не захватывает окружающий текст, только $ term. Окружающие теги могут быть любыми допустимыми тегами.

    0:  
    1:  $term = 'cool';
    2:  ob_start();
    3:

   10:  foreach($items as $item) {
   11:    // echoing results here
   12:    echo '<div>' . $item->text . '</div>';
   13:  }

   30:  $content = ob_get_contents();
   31:  ob_clean() ;
   32:
   33:  $pattern = "/(?<!<[^>])($term)/i";
   34:  $replace = "<span style=\"background: #f00\">$1</span>";
   35:  echo preg_replace($pattern, $replace, $content);
   36: 

РЕДАКТИРОВАТЬ: цикл foreach является одним из многих и находится в отдельном классе. Из-за этого я не могу сделать замену в самом цикле. Также представляется более эффективным обрабатывать окончательный вывод вместо каждого цикла данных.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2008

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

$pattern = "/[^<>]*$term[^<>]*/i";
$replace = "<span style=\"background: #f00\">$0</span>";
0 голосов
/ 15 ноября 2008

Зачем нужен preg_replace?

Вот как бы я решил проблему:

Случай 1: Выделите подстроку результата: Используйте strpos () или stripos (), чтобы получить индекс первого вхождения в строке. Далее: Получить подстроку из index-X в index + L + Y, где X и Y - это определенные константы, которые описывают количество символов, которые должны быть выделены до и после слова, а L - длина слова. Затем примените -tag вокруг сгенерированной подстроки.

Случай 2: Выделите тег отверстия: Вы все еще можете выполнять поиск по strpos / stripos. Затем разделите строку на две части: первая часть будет подстрокой от нуля до указателя, а вторая часть будет состоять из остальной части строки. Затем: найдите последнее вхождение (strrpos / strripos) '>' в строке 1 и первое вхождение '<' в строке 2. Вставьте выделение и наслаждайтесь;) </p>

Некоторые люди, сталкиваясь с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы - Джейми Завински

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