使用java中的regex提取标题标记(h1到h6)的内容

时间:2015-03-24 14:14:57

标签: java html regex pattern-matching

我想从网页中提取所有标题标记的内容。 我试过这个正则表达式

  

(?i)<h([1-6].*?)>(.*?)</h([1-6])>

问题是头标签是否像这样 -

  

<h1><I>Contents</I></h1>

它给我输出 -

  

<I>Contents</I>.

我希望它只打印

  

内容

输出中的

。 我该如何修改?

1 个答案:

答案 0 :(得分:0)

(?<=\>)(?!\<)(.*)(?=\<)(?<!\>)

即使输入为<h1><I>Contents</I></h1>,这也能正常工作。在这里测试一下:https://regex101.com/r/tF7tG7/1


说明

使用前瞻和后瞻,我总是检查捕获组的开头是否没有>个字符。然后我捕捉到它们之间的一切。然后,我检查在我捕获的那个之前是否还有<。查看前瞻和后视以获得更清晰的理解。

在PHP中实现

<?php
$string = "<h1><I>Contents</I></h1>";
preg_match("#(?<=\>)(?!\<)(.*)(?=\<)(?<!\>)#", $string, $matches);
var_dump($matches[1]);

警告

请为了上帝之爱,不要使用正则表达式来解析任何形式的HTML或XML。

MAJOR EDIT

(?<=(?!h1|h2|h3|h4|h5|h6)\>)(?!\<)(.+?)(?=\<\/.+?(?=h1|h2|h3|h4|h5|h6))

此正则表达式按您希望的方式解析内容。在这里测试一下:https://regex101.com/r/vM1rI0/1