【问题标题】:Regex preg_match_all HTML a tag for retrieving names,ids and hrefs正则表达式 preg_match_all 用于检索名称、ID 和 href 的 HTML 标记
【发布时间】:2013-08-20 22:25:02
【问题描述】:

所以我一直在尝试使用一些正则表达式从<a href='#' >HTML a tag</a> 中提取信息,以获得可能的标签的三种不同模式。

<a id="Anchor_One" name="Anchor_One"> Anchor Details </a>
<a href="#Anchor_Two" name="Anchor_Two" > Anchor Two Details </a>
<a name="Anchor_Three" > Anchor Three Details </a>

到目前为止,我有一些正则表达式可以从给定的 HTML 标记 /(\\w+)\s*=\\s*("[^"]*"|\'[^\']*\'|[^"\'\\s&gt;]*)/ 中提取所有属性。而且我还有一些正则表达式来匹配具有href 属性活动/&lt;a\s[^&gt;]*href=(\"??)([^\" &gt;]*?)\\1[^&gt;]*&gt;(.*)&lt;\/a&gt;/siU 的链接。但我似乎无法创建一个模式来匹配链接标签可能具有的其他组合。

<a id="Anchor_One" name="Anchor_One"> Anchor Details </a>
<a name="Anchor_Three" > Anchor Three Details </a>

没有设置href 属性的链接,不会被我当前的模式拾取,所以不是所有的锚都可以检索到。

    $regexp = '/<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU';
    //parse the page with the provided regular expression
    if(preg_match_all($regexp, $sessionBlock, $htmlMatches))
    {

    }

【问题讨论】:

  • 不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php

标签: php regex html-parsing preg-match-all


【解决方案1】:

请,请,请不要使用正则表达式来解析 HTML。

HTML 不是一种常规的结构化语言,因此用正则表达式解析它非常困难,而且一团糟。

查看these alternatives 以在 PHP 中解析 HTML。

【讨论】:

  • 为了您自己,请使用正则表达式作为最后的手段。我犯了一个错误尝试这个,到最后它是一场灾难。试试 DOM 扩展。
  • 我认为 DOMElement 的 getAttribute 方法可以提取这些:php.net/manual/en/domelement.getattribute.php
  • @Killrawr:Dom 也非常适合 HTML 解析。您可以关闭警告(内部报告),有针对损坏的 HTML 的恢复功能等等。在您的问题中,我没有看到任何无法使用 DOM 解决的问题。
  • 嗯,这一切都已经通过网站上的问答环节带来了,所以我认为在 cmets 中再次重复它没有用。我相信你会管理它,如果没有,请提出一个新问题。
  • 您想要完全匹配或捕获链接标签中的什么模式,只是锚名称?
【解决方案2】:

试试这个"~&lt;a(?=[^&gt;]* name=[\"']([^'\"]*)|)(\s+[^&gt;]*)?&gt;(.*?)&lt;/a&gt;~"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2011-11-03
    • 2011-04-19
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多