从 DOM 对象中删除跨度而不是内容并将其保存到变量中
Posted
技术标签:
【中文标题】从 DOM 对象中删除跨度而不是内容并将其保存到变量中【英文标题】:Removing a span from a DOM object but not the content and save it to a variable 【发布时间】:2011-08-16 11:53:03 【问题描述】:假设我有以下字符串:
<span>This <b>is</b> an <span class="something">example</span></span>
我想删除跨度而不是内容。
$content = '<span>This <b>is</b> an <span class="something">example</span></span>';
$dom = new DOMDocument();
$dom->loadXML($content);
$nodes = $dom->getElementsByTagName('span');
foreach ($nodes as $node)
// remove span but not content
$dom->save($var); // $dom->save() saves to file but I want to save to $var
所以$var
包含:This <b>is</b> an example
。
所以基本上我有两个问题:
-
如何删除
span
s
如何将剥离的字符串保存到变量中
【问题讨论】:
php Dom Remove element leave contents的可能重复 【参考方案1】:这样的事情应该可以解决问题:
<?php
function removeTag($content, $tagName)
$dom = new DOMDocument();
$dom->loadXML($content);
$nodes = $dom->getElementsByTagName($tagName);
while ($node = $nodes->item(0))
$replacement = $dom->createDocumentFragment();
while ($inner = $node->childNodes->item(0))
$replacement->appendChild($inner);
$node->parentNode->replaceChild($replacement, $node);
return $dom->savehtml();
$content = '<span>This <b>is</b> an <span>example</span></span>';
echo removeTag($content, 'span'); // echos "This <b>is</b> an example"
【讨论】:
【参考方案2】:编辑:
<?php
$content = '<span><h1><span>This <b>is</b> an <span>example</span></span></h1></span>';
$dom = new DOMDocument();
$dom->loadXML($content);
for ($node = $dom->getElementsByTagName('span')->item(0);
$node !== null;
$node = $dom->getElementsByTagName('span')->item(0))
// merge into parent
$parent = $node->parentNode;
$parent->removeChild($node);
for ($el = $node->firstChild; $el !== null; $el = $el->nextSibling)
$parent->appendChild($el->cloneNode(true));
echo $dom->saveHTML();
<?php
$content = '<span>This is an <span>example</span></span>';
$dom = new DOMDocument();
$dom->loadXML($content);
echo $dom->documentElement->textContent;
或者更简单地说:
echo strip_tags($content);
【讨论】:
我只想剥离跨度标签而不是所有标签。抱歉,如果我的问题不清楚。 经过测试,这也有效。谢谢!虽然 answer tick 会去 lonesomeday's answer。以上是关于从 DOM 对象中删除跨度而不是内容并将其保存到变量中的主要内容,如果未能解决你的问题,请参考以下文章
使用 CoreData 而不是仅仅通过 get 请求获取数据并将其保存在局部变量中的原因
PHP 通过 id 从跨度中获取文本/值并将其放入具有 cURL 的外部站点的变量中
从 DOM 中分离对象内容,添加其他内容,然后附加到 DOM