【问题标题】:How do I match between two closing tags with regex in php?如何在 php 中使用正则表达式匹配两个结束标签?
【发布时间】:2013-04-08 02:40:18
【问题描述】:

我有一段 HTML(不是完整的 HTML 文档),其中包含以下几个实例:

    </div>




            some text is here

    </h3>

我只想匹配“这里有一些文本”,但在使用 php 正则表达式时无法理解多行、换行符和空格。我得到的是:

    preg_match('/<\/div>[\s\r\n\t]*(.*)[\s\n\r\t]*<\/h3>/', $string, $matches);

但这似乎不起作用。我也尝试过使用 DOMDocument(),但它会引发各种错误,可能是因为这不是完整的 HTML 文档。

有什么想法吗??

【问题讨论】:

  • 使用 HTML 解析器。你说 DOMDocument() 是“抛出各种错误”,所以我建议你删除这个问题并发布一个带有错误的 DOMDocument() 问题的新问题,让我们修复它。与其帮助你在工作中使用错误的工具,不如帮助你使用正确的工具。
  • 怎么不工作了?这对我来说似乎工作得很好。你检查$matches[1]了吗?
  • @AndyLester 我可能弄错了,但正如我在帖子中所说,这不是一个完整的 HTML 文档,它甚至还有额外的不是 HTML 的数据。如果我实际上可以在其上使用 DOMDoc,我会对查看您的示例代码感兴趣,但我已经在它上面花费了大量时间,并且认为我会走简单的路线。唉,ExplosionPills 的答案非常适合我的需求。
  • 你看过 simplehtmldom 吗?我被引导相信它比 DOMDocument 更健壮。 simplehtmldom.sourceforge.net
  • 我过去看过它,从来没有时间弄清楚如何使用它,但我现在想通了,它对我的​​整个项目来说要好得多。谢谢!

标签: php html regex html-parsing


【解决方案1】:

使用类似的东西

preg_match("@</div>(.*?)</h3>@s", $html, $matches);

s PCRE 修饰符(在最后一个@ 之后)允许. 匹配换行符。 .*? 完成后,它只会匹配到 first &lt;/h3&gt; 而不是最后一个。标签之间的数据将在$matches[1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多