Как составить регулярку в данном случае?

Друзья, подскажите, пожалуйста, правильную регулярку для следующей ситуации:
Этот кусок кода - часть результата поиска по сайту на запрос "game".
Задача: необходимо выделить в найденном контенте вводимый в поиск запрос.
Т.е. вводим в поиск "game", в результате в переменную $c получаем контент. В этом контенте нужно выделить "game" с помощью .
$c = '
<div class="fsearchp">
<p><a href="/5278-bams-bad-ass-game-show.html" title="Перейти на страницу сериала «Bam's Bad Ass Game Show»">Bam's Bad Ass Game Show</a> (2014 - ...)
<span>(Bam's Bad Ass Game Show)</span>   
</p>    
</div>';
// Вот регулярка:
$c = preg_replace("/(game)/i", "<b>$0</b>", $c);

С данной регуляркой результат такой:
<div class="fsearchp">
<p><a href="/5278-bams-bad-ass-&lt;b&gt;game&lt;/b&gt;-show.html" title="Перейти на страницу сериала «Bam\'s Bad Ass <b>Game</b> Show»">Bam\'s Bad Ass <b>Game</b> Show</a> (2014 - ...)
<span>(Bam's Bad Ass <b>Game</b> Show)</span>   
</p>    
</div>

Как мы видим, происходит замена и внутри тегов..
Необходимо, чтобы происходила замена только между тегов..
Буду очень признателен за помощь..
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 3
@ynblpb_spb
дятел php
Простой регуляркой этого не сделать. Нужно или с _callback как-то думать (не уверен, что получится), либо смотреть в сторону более адекватных решений с поиском. Самое простое - sphinx. Там уже встроена возможность подсветки результатов поиска, как вы пытаетесь сделать
Ответ написан
Комментировать
sofcase
@sofcase
Веб-разработчик
Можно задать правило чтобы подсветка была только в span теге, но это сработает только для одного слова либо более 2х но в том же порядке что и ключевик.
$c = preg_replace("/span>.*?(game).*?<\/span/i", "<b>$0</b>", $c);

Поиграть можно здесь: https://regex101.com/r/bW4gQ3/1

Но так как вы делаете не совсем верно, у вас содержимое в SPAN теге все равно подставляется заранее, так ведь? так вот делать замену нужно на том этапе.
Если у вас поиск осуществляется средствами Sphinx, тогда можете выполнить конструкцию call snippets, она сама подсветит нужные участки по заданым правилам.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
замени
"/(game)/i"
на
"/>[^<]+(game)[^<]+</i"
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы