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






Зачем нужна 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
Я очень устал от цитаты JZ, особенно в ситуациях, когда регулярное выражение - очень простое решение.
Найти термин и все, вплоть до HTML-тегов до и после него, - это то же самое, что найти термин для всех символов до и после него, которые не являются угловыми скобками. С регулярным выражением это тривиально:
$pattern = "/[^<>]*$term[^<>]*/i";
$replace = "<span style=\"background: #f00\">$0</span>";
Мне это нравится. Это легче понять, поскольку, очевидно, я все еще новичок в регулярных выражениях.