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

Php 正则表达式提取HTML,保留文本,php,html,regex,Php,Html,Regex,我有一段HTML: <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> 正在回响: <iframe width="300" height="200" fra

我有一段HTML:

<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>
正在回响:

<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456"></iframe>Some text I don't want
一些我不想要的文本
所以我不想解析整个文档,只想解析这个特定的字符串

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

我需要提取HTML,但保留文本(因此看起来像这样):



有多个不同的嵌入代码,所以我想我要问的是,删除未包装在HTML元素中的文本(介于<和>)的最佳方法是什么(这是一个简单的正则表达式,在99%的情况下可以实现您想要的功能:

<[^>]+>
]+>
但它所做的只是匹配XML/HTML标记。仅此而已。没有明确的方法告诉它只匹配某个节点(如
)的DOM子树内的文本。为此,您需要使用上下文无关的解析器,如DOM解析器

您的示例输入将匹配到:

{
    "<div class="embed">",
    "<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456">",
    "</iframe>",
    "</div>"
}
{
"",
"",
"",
""
}
考虑到这一点:
输入文本,尽管在技术上被注释掉,但最终还是会提取出
。不过,事先删除所有出现的regex
应该可以解决这个问题


总之,一般来说,最好对任何XML/HTML使用DOM解析器。

这是一个简单的正则表达式,在99%的情况下都能满足您的需要:

<[^>]+>
]+>
但它所做的只是匹配XML/HTML标记。仅此而已。没有明确的方法告诉它只匹配某个节点(如
)的DOM子树内的文本。为此,您需要使用上下文无关的解析器,如DOM解析器

您的示例输入将匹配到:

{
    "<div class="embed">",
    "<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456">",
    "</iframe>",
    "</div>"
}
{
"",
"",
"",
""
}
考虑到这一点:
输入文本,尽管在技术上被注释掉,但最终还是会提取出
。不过,事先删除所有出现的regex
应该可以解决这个问题


总之,一般来说,最好对任何XML/HTML使用DOM解析器。

可能的重复项和几十个其他项。此外,使用正则表达式解析HTML/XML或任何具有自己解析器的项几乎总是一个坏主意,通常会导致比它解决的问题更多的问题。可能的重复项和几十个其他项。此外,使用例如,解析HTML/XML或任何其他有自己解析器的东西几乎总是一个坏主意,通常会导致比它解决的问题更多的问题。@Gordon:确实如此,正如我在回答中提到的(一分钟前的忍者更新)。在这本书中,我还建议如果需要在DOM树中设置搜索范围,就使用DOM解析器。@Gordon,@kieran:没必要为此争吵,伙计们。从我的观点来看,这只是一个简单的误用。显然,@kieran所指的“未包装在HTML元素中的文本”是“不在任何一对
”之间。如果我对这个假设是正确的,那么简单地用“HTML标记括号对”(或类似的)替换“HTML元素”应该足以修复错误的措辞/混淆。@Gordon:确实如此,正如我在回答中提到的(一分钟前的忍者更新)。在这篇文章中,我还建议如果需要在DOM树中设置搜索范围,就改用DOM解析器。@Gordon,@kieran:没必要为此争吵,伙计们。从我的观点来看,这只是一个简单的误用。显然,@kieran所指的“没有包装在HTML元素中的文本”是不在任何一对
”之间。如果我对这个假设是正确的,那么简单地用“HTML标记括号对”(或类似的)替换“HTML元素”应该足以修复误用/混淆。
{
    "<div class="embed">",
    "<iframe width="300" height="200" frameborder="0" allowfullscreen="" src="http://www.youtube.com/embed/123456">",
    "</iframe>",
    "</div>"
}