繁体   English   中英

PHP:如何检查是否 <p> 有一个子节点 <iframe> 用DOMDocument?

[英]PHP: How to check if a <p> has a child node of <iframe> with DOMDocument?

如何检查p是否具有DOMDocumentiframe子节点?

例如,

<p><iframe ....></p>

我想打印这个,

<iframe ....>

而,

<p>bla bla bal</p>

然后什么也不做,或者只打印p内的任何内容,

<p>bla bla bal</p>

要么,

<p>bla bla <b>bal</b></p>

然后什么也不做,或者只打印p内的任何内容,

<p>bla bla <b>bal</b></p>

我的PHP,

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

if($dom->getElementsByTagName('p')->length > 1 )
{
    ...
}
else // if it is only a single paragraph... then do what I want above...
{

    foreach ($dom->getElementsByTagName('p') as $node)
    {
        if ($node->hasChildNodes()) 
        {
           foreach( $dom->getElementsByTagName('iframe') as $iframe ) 
            {
               ... something
            }
        }
        else
        {
            ... 
        }
     }
}

可能吗?

您正在尝试查找所有iframe元素,这些元素是p元素的唯一子节点。

如果找到,您想要用它们替换它们的父p元素。

/** @var DOMElement $p */
foreach ($doc->getElementsByTagName('p') as $p) {
    if ($p->childNodes->length !== 1) {
        continue;
    }

    $child = $p->childNodes->item(0);

    if (! $child instanceof DOMElement) {
        continue;
    }

    if ($child->tagName !== 'iframe') {
        continue;
    }

    $p->parentNode->insertBefore($child, $p);
    $p->parentNode->removeChild($p);
}

这个foreach循环只迭代所有p元素,忽略所有没有单个子节点的子节点,而不是具有iframe标记名的DOME元素(注意:比较中总是小写)。

如果找到一个p元素,则在它之前移动内部iframe,然后删除该段落。

用法示例:

<?php
/**
 * @link http://stackoverflow.com/q/19021983/367456
 */

$html = '
<p><iframe src="...."></p>
<p>bla bla bal</p>
<p>bla bla <b>bal</b></p>
<p></p>
';

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

/** @var DOMElement[] $ps */
// $ps = $;

/** @var DOMElement $p */
foreach ($doc->getElementsByTagName('p') as $p) {
    if ($p->childNodes->length !== 1) {
        continue;
    }

    $child = $p->childNodes->item(0);

    if (!$child instanceof DOMElement) {
        continue;
    }

    if ($child->tagName !== 'iframe') {
        continue;
    }

    $p->parentNode->insertBefore($child, $p);
    $p->parentNode->removeChild($p);
}

// output
foreach ($doc->getElementsByTagName('body')->item(0)->childNodes as $child) {
    echo $doc->saveHTML($child);
}

演示和输出:

<iframe src="...."></iframe>
<p>bla bla bal</p>
<p>bla bla <b>bal</b></p>
<p></p>

希望这是有帮助的。

这样做:

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

    if($dom->getElementsByTagName('p')->length > 1 )
    {
        ...
    }
    else // if it is only a single paragraph... then do what I want above...
    {

        foreach ($dom->getElementsByTagName('p') as $node)
        {
            if ($node->hasChildNodes()) 
            {
                if($dom->getElementsByTagName('iframe')->length > 0 )
                  {
                  foreach( $dom->getElementsByTagName('iframe') as $iframe ) 
                   {
                      ... something
                   }
                }
            }
            else
            {
                ... 
            }
         }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM