我不记得它的名字,但我相信你可以在RegExp对象中引用已匹配的字符串。我想要做的是匹配给定字符串中的所有标签,例如
<ul><li>something in the list</li></ul>
RegExp应该只能匹配相同的标签,然后我将使用递归函数将所有单个匹配放在一个数组中。如果我可以引用第一个匹配,那么应该有效的正则表达式将是。
var reg = /(?:<(.*)>(.*)<(?:FIRST_MATCH)\/>)/g;
匹配的数组应该包含
match[0] = "<ul><li>something in the list</li></ul>";
match[1] = "ul";
match[2] = ""; // no text to match
match[3] = "li";
match[4] = "something in the list";
感谢您的帮助
答案 0 :(得分:2)
您好像是指反向引用(\1
,\2
):
var s = '<ul><li>something in the list</li></ul>';
s.match(/<([^>]+)><([^>]+)>(.*?)<\/\2><\/\1>/)
// => ["<ul><li>something in the list</li></ul>",
// "ul",
// "li",
// "something in the list"]
结果与您想要的结果不完全相同。但重点是反向引用\1
,\2
匹配早期组匹配的字符串。
答案 1 :(得分:1)
使用正则表达式解析HTML是不可能的(如果您对细节感兴趣,那是因为HTML解析需要比正则表达式可以表达的有限状态自动机更强的自动机类型 - 查找FSA与FST了解更多信息)。
您可能能够针对特定问题解决一些问题,但如果您想使用Javascript可靠地解析HTML,那么还有其他方法可以解决这个问题。在网上搜索:解析html javascript,你会得到很多关于如何做到这一点的指示。
答案 2 :(得分:0)
我做了一个肮脏的解决方法。还需要工作思路。
var str = '<div><ul id="list"><li class="something">this is the text</li></ul></div>';
function parseHTMLFromString(str){
var structure = [];
var matches = [];
var reg = /(<(.+)(?:\s([^>]+))*>)(.*)<\/\2>/;
str.replace(reg, function(){
//console.log(arguments);
matches.push(arguments[4]);
structure.push(arguments[1], arguments[4]);
});
while(matches.length){
matches.shift().replace(reg, function(){
console.log(arguments);
structure.pop();
structure.push(arguments[1], arguments[4]);
matches.push(arguments[4]);
});
}
return structure;
}
// parseHTMLFromString(str); // ["<div>", "<ul id="list">", "<li class="something">", "this is the text"]