正则表达式提取HTML,留下文本

时间:2011-11-16 12:12:50

标签: php html regex

我有这段HT​​ML:

<div class="embed">
<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456"></iframe>
Some text I don't want
</div>

这是插入HTML的方式:

<div class="embed"><?php echo $item['embed_html']; ?></div>

这就是

 $item['embed_html']

呼应:

<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456"></iframe>Some text I don't want

所以我想解析整个文档,只是这个特定的字符串。

不要担心,这不是“外部用户”输入的HTML,在任何人指出允许原始代码到页面的安全问题之前...

我需要提取HTML但保留文本(所以它看起来像这样):

<div class="embed">
<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456"></iframe>
</div>

有多种不同的嵌入代码,所以我想我要问的是删除未包含在HTML元素中的文本的最佳方法是什么(在&lt;和&gt;之间)(<img, <p, <div, <iframe, <object, <embed, <video等可能都在本节中使用)。只是如果有任何文本添加到它没有包装在标签中,它应该从字符串中删除它。

想要在标记中包装有问题的文本,我想完全删除它。在某种程度上,与strip_tags()的反向

1 个答案:

答案 0 :(得分:3)

这是一个简单的正则表达式,可以在99%的情况下执行您想要的操作:

<[^>]+>

它所做的只是匹配XML / HTML标记。而已。没有干净的方法告诉它只匹配某个节点的DOM子树内的文本(例如<div class="embed">)。为此,您将使用无上下文解析器,例如DOM解析器。

您的样本输入将匹配到:

{
    "<div class="embed">",
    "<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456">",
    "</iframe>",
    "</div>"
}

鉴于此:<!-- <foo> -->输入文字,但最终会在提取<foo>后尽管已经过技术评论。事先删除所有出现的正则表达式<!--.*?-->应该可以解决这个问题。

无论如何,一般来说,你最好使用DOM解析器来处理任何XML / HTML。