Php 剥离HTML标记及其内容
我正在使用DOM解析字符串。我需要的功能,带跨标签及其内容。例如,如果我有:Php 剥离HTML标记及其内容,php,dom,tags,html,strip,Php,Dom,Tags,Html,Strip,我正在使用DOM解析字符串。我需要的功能,带跨标签及其内容。例如,如果我有: This is some text that contains photo. <span class='title'> photobyile</span> 这就是我所尝试的: $dom = new domDocument; $dom->loadHTML($string); $dom->preserveWhiteSpace = false; $span
This is some text that contains photo.
<span class='title'> photobyile</span>
这就是我所尝试的:
$dom = new domDocument;
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;
$spans = $dom->getElementsByTagName('span');
foreach($spans as $span)
{
$naslov = $span->nodeValue;
echo $naslov;
$string = preg_replace("/$naslov/", " ", $string);
}
我知道$span->nodeValue
返回span标记的值,而不是整个标记,但我不知道如何获得整个标记以及类名
谢谢,
Ile尝试直接从DOM树中删除跨距
$dom = new DOMDocument();
$dom->loadHTML($string);
$dom->preserveWhiteSpace = false;
$elements = $dom->getElementsByTagName('span');
while($span = $elements->item(0)) {
$span->parentNode->removeChild($span);
}
echo $dom->saveHTML();
@ile—我遇到了这个问题—这是因为foreach迭代器的索引一直在增加,而在DOM上调用removeChild()似乎也会从DomNodeList中删除节点($span)。因此,对于移除的每个跨度,节点列表将收缩一个元素,然后将其foreach计数器递增一。最终结果:它跳过了一个跨度 我相信还有一种更优雅的方法,但我就是这样做的——我将引用从DomNodeList移动到第二个数组,在那里它们不会被removeChild()操作删除
foreach($spans as $span) {
$nodes[] = $span;
}
foreach($nodes as $span) {
$span->parentNode->removeChild($span);
}
我懂了。。。尽管如此,我必须承认我不知道foreach循环到底是如何工作的。现在更清楚了。非常感谢。如果您不需要使用DOM,请查看手册上的注释。您不能告诉strip_标记它应该删除哪些标记,只能告诉它不应该删除哪些标记。正确,这就是为什么我引用注释,其中可以找到剥离标记的方法。如果不是DOM,我就必须使用正则表达式。这不是我真正想要的:)+1分,因为不使用regexin而不是使用echo解析HTML;有没有办法将它保存为变量中的字符串,以便我可以进一步操作它?Thanks@AhmadAlfy
$theVariable=$dom->saveHTML()代码>。。。说真的,你需要多学一点PHP…派对有点晚了,但这并不能帮我删除内容。如果我使用上述代码(将loadHTML
更改为loadHTMLfile
,并将'span'
更改为'link'
),我所有的
标记都会消失,但它们的内容仍然存在(即http://www.something.com
变为http://www.something.com
)@Birrel不是因为它不是“成对”元素,因此解析器不希望它包含任何内容。尝试将您的HTML更改为其他标记,例如,
,该标记无论如何都应用于链接。@LukášLalinský我正在解析XML文件,它们与常规网页的格式不同。更具体地说,我正在解析RSS提要——它们有非常松散的标准化规则,所以没有两个是相同的。一个可能有…
,而另一个可能有
。至少可以说,这是令人沮丧的。
foreach($spans as $span) {
$nodes[] = $span;
}
foreach($nodes as $span) {
$span->parentNode->removeChild($span);
}