PHP:解析HTML页面时如何删除一些标签?

时间:2018-02-11 18:58:27

标签: php parsing xpath

在解析网页的一部分时(来自< div>带有“parse-it”id),我想要删除<脚本>标签,以及来自<的'href'属性a>来自那里的标签。在这里,你是我的代码:

$url = 'http://example.com/';
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$html = curl_exec($ch);
curl_close($ch);
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$result = '';
foreach ($xpath->evaluate('//*[starts-with(@id, "parse-it")]') as $childNode) {
$result .= $dom->saveHtml($childNode);
}
echo $result;

有什么建议吗?提前谢谢。

UPD:文档示例:https://jsfiddle.net/azt97tm4/

3 个答案:

答案 0 :(得分:0)

您可以使用STR_Replace。

http://php.net/manual/en/function.str-replace.php



$result .= $dom->saveHtml($childNode);
$target = array("<script>", "www.example.com");
$modify   = array("", "google");
$output = str_replace($target, $modify, $result);
}
echo $output;
&#13;
&#13;
&#13;

试试这个。如有任何问题请问我。

答案 1 :(得分:0)

$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);

foreach ( $xpath->query('//div[starts-with(@id, "parse-it")]//script') as $badScriptNode) {

    $badScriptNode->parentNode->removeChild($badScriptNode);
}

foreach ( $xpath->evaluate('//div[starts-with(@id, "parse-it")]//a[@href]') as $badAnchorNode) {

    $badAnchorNode->removeAttribute("href");
}

echo $dom->saveHTML();

答案 2 :(得分:0)

以下XSLT代码从XML文档中删除所有脚本元素和/ @ href属性。我在这里使用过XSLT 1.0,因为虽然XSLT 3.0使它更短(并且通过安装相关的Saxon库可用于PHP),但PHP用户仍然更广泛地使用XSLT 1.0。

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- default template copies everything unchanged -->

<xsl:template match="node()|@*">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
</xsl:template>

<!-- drop script elements -->

<xsl:template match="script"/>

<!-- drop a/@href attributes -->

<xsl:template match="a/@href"/>

</xsl:transform>

请注意,XSLT(如XPath)被定义为对XML而不是HTML进行操作,因此您可能需要进行初始转换 - 我不了解PHP世界以了解详细信息。如果源文档使用名称空间,您可能还需要进行更改。