Как искать подстроку, найденную в строке текста, и выделять ее все

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

Итак, если $ term "круто", preg_replace должен иметь:

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

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

    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 является одним из многих и находится в отдельном классе. Из-за этого не могу произвести замену в самом шлейфе. Также кажется более эффективным обрабатывать окончательный вывод вместо каждого цикла над данными.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
1 274
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

Some people, when confronted with a problem, think "I know, I’ll use regular expressions." Now they have two problems - Jamie Zawinski

Мне это нравится. Это легче понять, поскольку, очевидно, я все еще новичок в регулярных выражениях.

Kevin Dente 15.11.2008 07:19

Я очень устал от цитаты JZ, особенно в ситуациях, когда регулярное выражение - очень простое решение.

Jan Goyvaerts 15.11.2008 11:03
Ответ принят как подходящий

Найти термин и все, вплоть до HTML-тегов до и после него, - это то же самое, что найти термин для всех символов до и после него, которые не являются угловыми скобками. С регулярным выражением это тривиально:

$pattern = "/[^<>]*$term[^<>]*/i";
$replace = "<span style=\"background: #f00\">$0</span>";

Другие вопросы по теме