簡體   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