如何使用PHP从内容中删除所有锚标记

时间:2013-11-26 12:18:13

标签: php rss

我从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>标签的情况下提取内容。

4 个答案:

答案 0 :(得分:3)

解析rss时,最好剥离所有标记并维护用于文本格式化的标记(<p><b><i>等)。因此,您需要将第二个参数传递给strip_tags

  

Docs:

     

allowable_tags

     

您可以使用可选的第二个参数来指定被剥离的标签。

例如:

echo strip_tags($contentFromRSS, '<p><div><i><b><u>');

Sample

答案 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以及添加和元素。要获得固定片段,您必须保存每个孩子。

使用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

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);
}