Kela
Новичок
Нужна помощь с preg_replace
К примеру, есть такой текст:
(в первом примере слово Коля заключено в тег <b>, во втором варианте - нет)
задача состоит в том, чтобы убрать тэг <b> из абзаца с классом "someclass". Я пишу такой код:
В первом случае код отрабатывается нормально и тег убирается, однако во втором случае тег <b> убирается из второго абзаца, у которого нет класса "someclass".
После перечитывания мануала в третий раз, я сообразил, что это происходит из-за того, что во втором случае шаблон (.*?) "съедает" все до первого встреченного тега <b>, не останавливаясь на первом закрывающем теге </p>, как я задумывал. Таким образом, тег убирается из второго абзаца.
Собственно вопрос: как заставить регулярное выражение не перешагивать через первый встреченный закрывающий тег </p>? Иными словами, как делать сопоставление регулярного выражения ТОЛЬКО в пределах абзаца?
Для удобства, здесь исходный текст программы (17 строк, 560 байт), здесь она же в работе.
К примеру, есть такой текст:
PHP:
$msg = '
<p class="someclass">Привет, <b>Коля</b>! Как жизнь?</p>
<p>Спасибо,- <b>Хорошо!</b> Как ты?</p>
<p class="someclass">Привет, Коля! Как жизнь?</p>
<p>Спасибо,- <b>Хорошо!</b> Как ты?</p>';
задача состоит в том, чтобы убрать тэг <b> из абзаца с классом "someclass". Я пишу такой код:
PHP:
$msg = preg_replace('~<p class="someclass">(.*?)<b>(.*?)</b>(.*?)</p>~ius', '<p class="someclass">$1$2$3</p>', $msg);
После перечитывания мануала в третий раз, я сообразил, что это происходит из-за того, что во втором случае шаблон (.*?) "съедает" все до первого встреченного тега <b>, не останавливаясь на первом закрывающем теге </p>, как я задумывал. Таким образом, тег убирается из второго абзаца.
Собственно вопрос: как заставить регулярное выражение не перешагивать через первый встреченный закрывающий тег </p>? Иными словами, как делать сопоставление регулярного выражения ТОЛЬКО в пределах абзаца?
Для удобства, здесь исходный текст программы (17 строк, 560 байт), здесь она же в работе.