如何检查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
{
...
}
}
}
有可能吗?
答案 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
{
...
}
}
}