2012-01-05 70 views
0

我有一些html,我想要在2个标签之间抓取。但是,嵌套标签存在于html中,所以查找不起作用,因为它会在第一个嵌套div上返回。REGEX模式 - 我如何匹配在html中的某个标签

基本上我想要我的正则表达式来..

匹配一些文字字面上,其次是高达其他文字文本字符串的任何字符。所以我的问题是我如何获得[^ <] *继续匹配,直到它看到下一个div。

< DIV ID = “测试”[^ <] * < DIV ID = “test2的”

示例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"> 
+0

什么语言是你使用,正则表达式的格式因语言而异。 – Stefan 2012-01-05 03:35:35

+0

[RegEx match open tags but XHTML self-contained tags]可能的重复(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – 2017-01-11 10:56:23

回答

1

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

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

但似乎你正在寻找在第一个嵌套div开始之前的div内的文本。这将是类似于<div[^>]*>(.*?)<div

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

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

正则表达式不能解析HTML。如果这是应用程序的一部分,那么你做错了什么。如果您绝对必须解析文档,请使用html/xml解析器。

如果您尝试屏蔽某些内容并且不想打扰解析器,请在您正在抓取的页面中查找识别标记。例如,也许嵌入式div在您想要匹配的那个之前结束,所以您可以改为匹配</div></div>

另外,这里是一个正则表达式,可以满足您的要求。然而,这是非常脆弱的:这将打破,如果,例如,#测试的孩子有孩子,或者HTML是无效的,或者我错过了什么,等等,等等...

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