preg_replace — сопоставление всего содержимого между двумя тегами

Я работаю с системой CMS, которая настаивает на размещении большого количества ненужной разметки & пустые теги между </figure> а также <figcaption>теги.

Я пытаюсь использовать регулярное выражение для соответствия & удалить этот мусор (к сожалению, исправить CMS невозможно).

Я, кажется, создал регулярное выражение, которое слишком голодное и также лишает тегов.

$str = '<p></p><figure class="image"><img title="Screenshot 2014-08-26 16.34.12.png" alt="Screenshot 2014-08-26 16.34.12.png" src="/image/Screenshot%202014-08-26%2016.34.12.png" class="image-style-none" typeof="foaf:Image"></figure><p></p>
<p>Â&nbsp;</p>
<p></p><figcaption>Screenshot 2014-08-26 16.34.12.png</figcaption><p></p>
<p>  </p>
<p> </p>
<p></p>';

preg_replace('#(</figure>).*?(<figcaption>)#s', '[replace-me]', $str);

Может кто-то указать мне верное направление?

1

Решение

preg_replace('#(?<=<\/figure>)(.*?)(?=<figcaption>)#ms', '[replace-me]', $str));

Разве регулярные выражения не такие веселые!

4

Другие решения

Вы можете использовать небольшую настройку вашего регулярного выражения.

(?<=</figure>).*?(?=<figcaption>)

Рабочая демонстрация

введите описание изображения здесь

Вы можете использовать приведенное выше регулярное выражение для сопоставления только содержимого и замены его пустой строкой. Посмотрите на раздел замены выше.

Идея состоит в том, чтобы использовать регулярное выражение для сопоставления содержимого между этими тегами, но исключить теги

2

function getNodeContent($name, $buffer) {
$matches = array();
preg_match_all("/<" . $name . "[\w\s]*[^>]*>(.*?)<\/" . $name . ">/", $buffer, $matches);
return isset($matches[1]) ? $matches[1] : '';
}

echo "<pre>";
var_dump(getNodeContent('figure', $str));
var_dump(getNodeContent('figcaption', $str));
echo "</pre>";
die();
1

Вы можете использовать регулярное выражение, которое удаляет любые <p> теги, содержащие только пробелы, неразрывные пробелы и символы не ascii, например

$str = preg_replace('/<p>(\\s|&nbsp;|[\x80-\xFF])*<\/p>/i', '', $str);

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

1

В строке замены используйте обратные ссылки на части в скобках:

preg_replace('#(</figure>).*?(<figcaption>)#s', '$1$2', $str);
1
По вопросам рекламы [email protected]