Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 如何将div替换为其子p节点之一_Php_Regex - Fatal编程技术网

Php 如何将div替换为其子p节点之一

Php 如何将div替换为其子p节点之一,php,regex,Php,Regex,这是我从回复中得到的html 我需要删除额外的文本 下面有一行内容 <?php $str = <<<HTML AAAA <span>span txt</span> <div class='unique_div' id='xrz' data-id='1'> div text <span>span text</span> <p class=

这是我从回复中得到的html

我需要删除额外的文本

下面有一行内容

<?php
    $str = <<<HTML
    AAAA <span>span txt</span>
    <div class='unique_div' id='xrz' data-id='1'>
        div text
        <span>span text</span>
        <p class='unique_p'>
            <span>p span text</span>
            <p>p p text</p>
        </p>
        div text
    </div>
    BBBB <span>span txt</span>
HTML;

既然您看到的似乎是HTML,并且考虑到您的需求需要对HTML进行某种形式的修改,我建议使用类似的DOM解析器

如果我正确理解了您的问题,您希望将
节点替换为
p
节点,该节点具有
id
属性
xrz
,该节点的class属性为
unique\p
,并且
div
的子节点

  • 获取
    div
    很容易,因为它有一个
    id
    ,并且它们是唯一的。因此,我们可以使用一种方法来获得
    div
  • 获取其子级
    p
    变得有点棘手,因为我们希望确保它既是
    div
    的子级,又具有指定的类。因此,我们将使用一个查询
  • 最后,我们将使用from there将
    div
    替换为其捕获的子
    p
  • 这里有一个简单的例子

    $str = <<<HTML
        AAAA <span>span txt</span>
        <div class='unique_div' id='xrz' data-id='1'>
            div text
            <span>span text</span>
            <p class='unique_p'>
                <span>p span text</span>
                <p>p p text</p>
            </p>
            div text
        </div>
        BBBB <span>span txt</span>
    HTML;
    
    libxml_use_internal_errors(true);
    $dom = new DOMDocument;
    $dom->loadHTML($str, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    $xpath = new DOMXPath($dom);
    $children = $xpath->query('//div/p[@class="unique_p"]');
    $p = $children->item(0);
    $div = $dom->getElementById('xrz');
    $div->parentNode->replaceChild($p, $div);
    echo $dom->saveHTML();
    
    $str=项目(0);
    $div=$dom->getElementById('xrz');
    $div->parentNode->replaceChild($p,$div);
    echo$dom->saveHTML();
    
    输出应该是这样的

    <p>AAAA <span>span txt</span> <p class="unique_p"> <span>p span text</span> </p><p> BBBB <span>span txt</span></p></p> AAAA span txt

    p跨文本

    BBBB span txt

    如果您想知道为什么输出可能与您预期的略有不同,请务必注意,问题中提供的初始HTML实际上格式不正确

    p
    元素表示一个段落。它不能包含块级元素(包括
    P
    本身)


    因此,每当DOM解析器在另一个
    p
    标记中发现一个打开的
    p
    标记时,它将首先隐式关闭前一个标记。

    我们不理解。您的意思是在创建了第一个示例后,要将内容更改为
    $str
    ?我需要得到第二个示例中的结果为什么?只要根据您想要修改它的任何原因创建一个单独的输出
    IF($reason){$str=example1}else{$str=example2}
    这是我从查询中得到的html。我需要删除额外的文本WOW。完美的解决方案。非常感谢。在运行查询时,您还应该指定
    div
    class属性。@revo这是不必要的,因为根据规范,
    id
    必须在整个DOM中是唯一的。
    id
    足够唯一在没有进一步限定的情况下标识DOM中的任何元素。很抱歉,我查看了XPath查询,希望得到
    div[@class=“unique\u div”]
    div[@id=“xrz”]
    ,但没有找到您稍后指定它的行。我试图在上面的项目符号2中阐明代码的作用 <p>AAAA <span>span txt</span> <p class="unique_p"> <span>p span text</span> </p><p> BBBB <span>span txt</span></p></p>