RegEx: удалить двойные теги <br /> - PullRequest
0 голосов
/ 03 июля 2019

У меня есть динамическая строка, которая может содержать теги h2 и в этих тегах h2 некоторые теги br.Я хочу удалить эти теги br из строки.

<h2>Headline 1</h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.<h2>Headline 2 <br /><br /></h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr<h2>Headline 2<br /><br /></h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr<h2>Headline 2</h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr

Чтобы удалить теги br, я использую это регулярное выражение:

/<h2.*?>.+?(<br[\s+]?\/>).+?<\/h2>/

Проблема в том, что мое первое совпадение <h2>Headline 1</h2>Lorem ipsum dolor sit amet, consetetur sadipscing elitr.<h2>Headline 2 <br /><br /></h2>.Да, работает как задумано :-) Но как сделать так, чтобы регулярное выражение захватывало только группы с br в тегах h2?

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Я предлагаю вам использовать синтаксический анализатор DOM.

Но, если вы действительно хотите использовать регулярные выражения, в этом случае это приемлемо, вы можете использовать preg_replace_callback:

$html = '<h2>Headline 1</h2>Lorem ipsum.<h2>Headline 2 <br /><br /></h2>dolor sit amet,<h2>Headline 2<br /><br /></h2>consetetur<br /> sadipscing elitr<h2>Headline 2</h2>Lorem<br /> ipsum';

# first, extract the string inside <h2>...</h>
$res = preg_replace_callback('~<h2>\K.*?(?=</h2>)~', 
            function($m) {
                # then remove the <br />
                return  preg_replace('~<br />~', '', $m[0]);
            },
            $html);

echo $res;

Вывод:

<h2>Headline 1</h2>Lorem ipsum.<h2>Headline 2 </h2>dolor sit amet,<h2>Headline 2</h2>consetetur<br /> sadipscing elitr<h2>Headline 2</h2>Lorem<br /> ipsum
1 голос
/ 03 июля 2019

Это может быть гораздо проще сделать более чем за 1 шаг:

  1. Используйте регулярное выражение для извлечения последовательности <h2>...</h2>
  2. Используйте регулярное выражение для удаления тегов <br />из последовательности <h2>...</h2>
  3. Введите новую строку
  4. Скопируйте все остальное как есть

Либо найдите:

(<\s*h2[^<]*>[^<]*)<\s*br\s*\/\s*>

и замените на:

\1

Повторяйте до тех пор, пока больше не будет выполнено никаких замен.

Проверка здесь .


Другое решение (более умное) - использовать правильный анализатор HTML и делать все, что вам нужно.

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