Я работаю с системой 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>Â </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);
Может кто-то указать мне верное направление?
preg_replace('#(?<=<\/figure>)(.*?)(?=<figcaption>)#ms', '[replace-me]', $str));
Разве регулярные выражения не такие веселые!
Вы можете использовать небольшую настройку вашего регулярного выражения.
(?<=</figure>).*?(?=<figcaption>)
Вы можете использовать приведенное выше регулярное выражение для сопоставления только содержимого и замены его пустой строкой. Посмотрите на раздел замены выше.
Идея состоит в том, чтобы использовать регулярное выражение для сопоставления содержимого между этими тегами, но исключить теги
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();
Вы можете использовать регулярное выражение, которое удаляет любые <p>
теги, содержащие только пробелы, неразрывные пробелы и символы не ascii, например
$str = preg_replace('/<p>(\\s| |[\x80-\xFF])*<\/p>/i', '', $str);
Хотя в этом случае и выполнимо, но обычно не одобряют использование регулярных выражений для изменения HTML.
В строке замены используйте обратные ссылки на части в скобках:
preg_replace('#(</figure>).*?(<figcaption>)#s', '$1$2', $str);