我想尝试替换以下标记的所有实例,并在之前和之后删除p和end p,但仅在使用readmore类时
<p><a class="readmore" href="http://www.google.com">My External Link</a></p>
提前致谢。
答案 0 :(得分:3)
您已经要求使用正则表达式,但是not really a good solution用于解析HTML。
加载要处理的文档,找到要随机播放的元素,随机播放。与此不同的东西可能有用:
$document = new DOMDocument();
$document->loadHTMLFile(FILENAME);
$xpath = new DOMXPath($document);
$nodeList = $xpath->evaluate("//p[contains(a[@class='readmore'])]");
foreach ($nodeList as $node) {
$node->parentNode->replaceChild($node->firstChild, $node);
}
有关使用XSL样式表删除节点的帮助,请参阅this answer。您可以构建类似以下内容的模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p[contains(a[@class='readmore'])]">
<xsl:copy-of select="a"/>
</xsl:template>
</xsl:stylesheet>
如果你真的想要走死路,那么我不认为我能阻止你。确保你在源代码控制中拥有所有内容并在提交之前查看差异......
preg_replace('#<p>(<a class="readmore" href="[^"]+">[^<]*<\/a>)<\/p>#', '\1');