什么是正则表达式的解决方案? PHP

时间:2014-07-18 16:47:55

标签: php regex

我想尝试替换以下标记的所有实例,并在之前和之后删除p和end p,但仅在使用readmore类时

<p><a class="readmore" href="http://www.google.com">My External Link</a></p>

提前致谢。

1 个答案:

答案 0 :(得分:3)

您已经要求使用正则表达式,但是not really a good solution用于解析HTML。

DOMDocument / XPath

加载要处理的文档,找到要随机播放的元素,随机播放。与此不同的东西可能有用:

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

XSLT

有关使用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');