正则表达式匹配嵌套html标记内的内容

时间:2018-12-16 15:26:39

标签: regex

我有这个正则表达式,可以在格式良好的HTML标记中获取内容,但是现在我的问题是:只有嵌套标记时,才如何获取内容?

<([.]*[^>]+)>(.*)<\/(?:\1[^>]?)>

正则表达式(带案例): https://regex101.com/r/iHnSCs/3

示例:

<h1><a>content inside</a></h1>

我只想获取“ content inside”一词,而不是<a> </a>

此问题的目的不是要在生产中或一般情况下使用正则表达式,而是关于格式正确的标签并迫使您自己使用正则表达式解决此问题。是here找到的HackerRank Strings Java挑战的一部分。

2 个答案:

答案 0 :(得分:0)

如果所有标签都是平衡且格式正确的,例如您一直都有打开和关闭标签(没有<img/>废话),则可以尝试使用递归来执行此操作。某些正则表达式引擎支持(?R)的递归。

基本上不是放置内容部分(.*),而是放置匹配内容或整个内容的东西(将嵌套标签与带有标签的标签等匹配):类似(\w+|(?R))

注意:为简单起见,我在这里使用\w+而不是.*,您可能还需要其他内容,但是我不建议您使用.*(它太宽泛,会贪婪地使用吃掉角色直到失败为止,从而耗尽内存和时间。

在此处查看示例:
* https://www.regular-expressions.info/recurse.html
(匹配平衡结构)
* http://www.rexegg.com/regex-recursion.html

答案 1 :(得分:0)

您需要的是正则表达式中的第二个捕获组(.*),您可以使用$2

来获取它。

为了在第一个HTML标签<h1>中获得内容,我使用replace方法,如下所示:

let text = `<h1><a>content inside</a></h1>`;

let text1 = text.replace(/<([.]*[^>]+)>(.*)<\/(?:\1[^>]?)>/,"$2");

console.log("text1",text1); // <a>content inside</a>

let text2 = text1.replace(/<([.]*[^>]+)>(.*)<\/(?:\1[^>]?)>/,"$2");

console.log("text2",text2); // content inside

我在这里使用了javascript。根据您打算使用的语言,您可以使用$2\2

获取第二个捕获组。