PHP:如何检查<p>是否具有DOMDocument的<iframe>子节点?</iframe> </p>

时间:2013-09-26 07:29:26

标签: php iframe domdocument

如何检查p的子节点iframe是否为DOMDocument

例如,

<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
        {
            ... 
        }
     }
}

有可能吗?

2 个答案:

答案 0 :(得分:3)

您正在尝试查找所有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);
}

Demo和输出:

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

希望这有帮助。

答案 1 :(得分:1)

这样做:

    $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
            {
                ... 
            }
         }
    }