我从RSS Feed中提取内容,但它附带了我需要删除的锚<a>
标记。
为此,我尝试了strip_tags
,但删除了所有HTML标记,包括<img>
。
然后我尝试了:
$content = preg_replace("/<a[^>]\+>|<a>|<\/a>/i", "", $content);
但它对我不起作用100%。
然后我尝试了DOM:
$xml = new DOMDocument();
$xml->loadHTML($content);
$links = $xml->getElementsByTagName('a');
但我不知道如何在没有<a>
标签的情况下提取内容。
答案 0 :(得分:3)
解析rss时,最好剥离所有标记并维护用于文本格式化的标记(<p>
,<b>
,<i>
等)。因此,您需要将第二个参数传递给strip_tags
。
allowable_tags
您可以使用可选的第二个参数来指定不被剥离的标签。
例如:
echo strip_tags($contentFromRSS, '<p><div><i><b><u>');
答案 1 :(得分:1)
删除<a>
元素,同时保持内在价值。
<?php
$doc = new DOMDocument();
$doc->loadHTML('<div><a href="#">text</a></div>');
foreach ($doc->getElementsByTagName('a') as $e)
{
$e->parentNode->nodeValue = $e->nodeValue;
}
echo $doc->saveHTML(); # <div>text</div>
完全删除<a>
。
<?php
$doc = new DOMDocument();
$doc->loadHTML('<div><a href="#">text</a></div>');
foreach ($doc->getElementsByTagName('a') as $e)
{
$e->parentNode->removeChild($e);
}
echo $doc->saveHTML(); # <div></div>
P.S。如果没有完全 HTML,很难做出“工作”的例子。即使我的代码没有开箱即用,你应该尝试自己修复它并放弃 gimme teh codez! ASAP 态度如聊天所示。
答案 2 :(得分:1)
您可以使用DOM函数修改HTML或XSLT来转换它。您需要知道loadHtml()将修复HTML-DOM以及添加和元素。要获得固定片段,您必须保存每个孩子。
$html = <<<'HTML'
<a href="http://foo.tld">TEST</a>
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
$textNode = $dom->createTextNode($node->nodeValue);
$node->parentNode->replaceChild($textNode, $node);
}
$fragment = '';
foreach ($dom->getElementsByTagName('body')->item(0)->childNodes as $node) {
$fragment .= $dom->saveHtml($node);
}
var_dump($fragment);
XSLT是一种用于转换DOM的语言。使用它会添加一些引导程序,但如果添加更多规则,那将是更好的方法。
$html = <<<'HTML'
<a href="http://foo.tld">TEST</a>
HTML;
$xsl = <<<'XSL'
<?xml version="1.0"?>
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="a">
<xsl:apply-templates/>
</xsl:template>
<!-- pass through for unknown tags in the xml tree -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
XSL;
$dom = new DOMDocument();
$dom->loadHTML($html);
$xslDom = new DOMDocument();
$xslDom->loadXml($xsl);
$xsltProc = new XsltProcessor();
$xsltProc->importStylesheet($xslDom);
$result = $xsltProc->transformToDoc($dom);
$fragment = '';
foreach ($result->getElementsByTagName('body')->item(0)->childNodes as $node) {
$fragment .= $result->saveHtml($node);
}
var_dump($fragment);
答案 3 :(得分:1)
$xml = new DOMDocument();
$xml->loadHTML($html);
$links = $xml->getElementsByTagName('a');
//Loop through each <a> tags and replace them by their text content
for ($i = $links->length - 1; $i >= 0; $i--) {
$linkNode = $links->item($i);
$lnkText = $linkNode->textContent;
$newTxtNode = $xml->createTextNode($lnkText);
$linkNode->parentNode->replaceChild($newTxtNode, $linkNode);
}