在解析网页的一部分时(来自< 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/
答案 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;
试试这个。如有任何问题请问我。
答案 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世界以了解详细信息。如果源文档使用名称空间,您可能还需要进行更改。