2014-09-18 100 views
1

我正在使用一个CMS系统,坚持要在</figure><figcaption>标签之间放置大量垃圾标记&空标签。preg_replace - 匹配两个标签之间的所有内容

我想用正则表达式来匹配&删除这个垃圾(不幸的是修复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); 

任何人都可以指向正确的方向吗?

+0

这可能太饿了,因为你没有使用匹配的标签:'

'与'
'一起。最好使用这些标签,然后只需使用这些标签即可替换它们。 – 2014-09-18 21:45:40

+0

预期的结果是作为来源,除了关闭

和之间的所有标记/标记应替换为[replace-me] – steve 2014-09-18 21:47:55

+2

HTML不是正则表达式可解析语言。 [*不要在HTML上使用正则表达式。只是不。*](http://stackoverflow.com/a/1732454/237955) – amphetamachine 2014-09-18 21:49:25

回答

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

不正则表达式只是很有趣!

+1

谢谢 - 这只是我需要的。其他答案也都是有效的,但这首先是为了回答我的需要。 – steve 2014-09-18 22:08:48

+1

(Upvoted其他人也尽管 - 非常感谢帮助) – steve 2014-09-18 22:09:14

1

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

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

尽管在这种情况下可行,但通常使用正则表达式来修改HTML。

1

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

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

Working demo

enter image description here

您可以使用正则表达式以上只匹配内容,并与一个空字符串替换它。看看上面的替代部分。

的想法是使用正则表达式环视那些标签之间的内容相匹配,但不包括标签

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

在替换字符串中使用回部分引用括号:

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