Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 剥离HTML标记及其内容_Php_Dom_Tags_Html_Strip - Fatal编程技术网

Php 剥离HTML标记及其内容

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

我正在使用DOM解析字符串。我需要的功能,带跨标签及其内容。例如,如果我有:

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