【问题标题】:REGEX Pattern - How do I match upto a certain tag in html正则表达式模式 - 如何匹配 html 中的某个标签
【发布时间】:2012-01-05 12:22:24
【问题描述】:

我有一些要在 2 个标签之间抓取的 html。但是嵌套标签存在于 html 中,因此查找不起作用,因为它会在第一个嵌套 div 上返回。

基本上我希望我的正则表达式...

从字面上匹配一些文本,后跟任意字符,直到另一个字面文本字符串。所以我的问题是如何让 [^ 继续匹配,直到看到下一个 div。

比如

示例 html

<div id="test" class="whatever">  
   <div class="wrapper">
   <fieldset>Test</fieldset><div class="testclass">some info</div>
   </div>
  <!-- end test div--></div>

</div>
 <div id="test2" class="endFind">

【问题讨论】:

标签: regex


【解决方案1】:

一般来说,我怀疑您想在您的正则表达式中查看“贪婪”与“懒惰”,假设您的平台/语言支持。

例如,&lt;div[^&gt;]*&gt;(.*?)&lt;/div&gt; 会使 $1 匹配 div 内的所有文本,但会尽量保持它的小。有人称*?为“懒星”。

但您似乎正在寻找在第一个嵌套 div 开始之前的 div 中的文本。就像&lt;div[^&gt;]*&gt;(.*?)&lt;div

阅读关于贪婪与懒惰的here 并检查以确保您使用的任何语言都支持它。

$ php -r '$text="<div>Test<div>foo</div></div>\n"; print preg_replace("/<div[^>]*>(.*?)<div.*/", "\$1", $text);'
Test
$ 

【讨论】:

    【解决方案2】:

    Regex 无法解析 HTML。如果这是应用程序的一部分,那么您做错了什么。如果您必须解析文档,请使用 html/xml 解析器。

    如果您尝试筛选抓取某些内容并且不想打扰解析器,请在您抓取的页面中寻找识别标记。例如,嵌入的 div 可能刚好在您要匹配的那个之前结束,因此您可以改为匹配 &lt;/div&gt;&lt;/div&gt;

    或者,这是一个满足您要求的正则表达式。但是,它非常脆弱:例如,如果#test 的孩子有孩子,或者 html 无效,或者我遗漏了某些东西等等,它就会崩溃……

    /<div id="test"[^<]*(<([^ >]+).+<\/$2>[^<]*)*<\/div>/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2013-04-30
      • 2015-03-31
      相关资源
      最近更新 更多