preg_replace - 匹配两个标记之间的所有内容

时间:2014-09-18 21:30:31

标签: php regex preg-replace

我正在使用CMS系统,该系统坚持要求大量的垃圾标记和放大器</figure><figcaption>代码之间的空标记。

我正在尝试使用正则表达式匹配&amp;删除这个垃圾(遗憾的是,无法修复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);

有人能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:4)

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

正则表达式不是那么有趣!

答案 1 :(得分:2)

您可以对正则表达式进行一些调整。

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

<强> Working demo

enter image description here

您可以使用上面的正则表达式仅匹配内容并将其替换为空字符串。看看上面的替换部分。

我们的想法是使用正则表达式环视来匹配这些标记之间的内容但排除标记

答案 2 :(得分:1)

您可以使用正则表达式删除仅包含空格,非中断空格和非ascii字符的任何<p>标记,例如

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

虽然在这种情况下可行,但通常不赞成使用正则表达式来改变HTML。

答案 3 :(得分:1)

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();

答案 4 :(得分:1)

在替换字符串中,使用对括号中部分的引用:

preg_replace('#(</figure>).*?(<figcaption>)#s', '$1$2', $str);