Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/70.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';s DOMXPath正在剥离匹配文本中的标记_Php_Html_Domdocument_Domxpath - Fatal编程技术网

PHP';s DOMXPath正在剥离匹配文本中的标记

PHP';s DOMXPath正在剥离匹配文本中的标记,php,html,domdocument,domxpath,Php,Html,Domdocument,Domxpath,昨天我问了这个问题,当时这正是我所需要的,但在处理一些实时数据时,我发现它并没有达到我的预期 它从HTML页面获取数据,但是它也会去掉捕获的文本块中的所有HTML标记,这不是我想要的。(我可能不想取出一些标记,但不是全部,这可以在以后完成)这是DOM的一个常见问题:如果要获取标记的内容及其所有子项的内容,必须做更多的工作 基本上,您必须循环与XPath查询匹配的子节点,以获取其内容 用户在手册页上的注释中提出了一个解决方案--请参阅 将此解决方案集成到您已有的代码中,应该会为HTML字符串的声

昨天我问了这个问题,当时这正是我所需要的,但在处理一些实时数据时,我发现它并没有达到我的预期


它从HTML页面获取数据,但是它也会去掉捕获的文本块中的所有HTML标记,这不是我想要的。(我可能不想取出一些标记,但不是全部,这可以在以后完成)

这是DOM的一个常见问题:如果要获取标记的内容及其所有子项的内容,必须做更多的工作

基本上,您必须循环与XPath查询匹配的子节点,以获取其内容

用户在手册页上的注释中提出了一个解决方案--请参阅


将此解决方案集成到您已有的代码中,应该会为HTML字符串的声明提供如下内容,以及子标记:

$html = <<<HTML
<div class="main">
    <div class="text">
        <p>
            Capture this <strong>text</strong> <em>1</em>
        </p>
        <p>
            And some other <strong>text</strong>
        </p>
    </div>
</div>
HTML;
唯一改变的是
foreach
循环的内容:您必须迭代子元素,而不是只使用
$tag->nodeValue


这给了我以下输出:

string '<p>
            Capture this <strong>text</strong> <em>1</em>
        </p>


<p>
            And some other <strong>text</strong>
        </p>' (length=150)
string'
捕获此文本1

和其他一些文本

'(长度=150)
这是匹配的
标记及其所有子项(包括标记)的完整内容



注:手册的用户说明中经常有有趣的想法和解决方案;-)

帕斯卡·马丁的答案很好,但我发现它可以简化

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    $innerHTML = '';

    $children = $tag->childNodes;
    foreach ($children as $child) {     
        $innerHTML .= $dom->saveHTML($child);
    }

    var_dump(trim($innerHTML));
}
这种方法似乎可以产生相同的结果,但不需要在
foreach
循环中创建新的
DomDocument
对象

编辑:

因此,在进一步的实验之后,您实际上可以将上述内容简化为:

$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    var_dump(trim($dom->saveHTML($tag)));
}
$dom = new DOMDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    var_dump(trim($dom->saveHTML($tag)));
}