改进JavaScript正则表达式,以匹配标记内部的内容,包括或不包括结束标记(self)
前言:我知道大家普遍反对使用正则表达式解析HTML。提前询问您,请避免在这方面提出任何建议改进JavaScript正则表达式,以匹配标记内部的内容,包括或不包括结束标记(self),javascript,regex,Javascript,Regex,前言:我知道大家普遍反对使用正则表达式解析HTML。提前询问您,请避免在这方面提出任何建议 解释。 我有下面的正则表达式 /<div class="panel-body">([^]*?)(<\/div>|$)/gi 。。它还匹配没有结束标记的内容 完全匹配: <div class="panel-body"> <a href="#">Link</a> Line 1 Line 2 Line 3 </div&
解释。 我有下面的正则表达式
/<div class="panel-body">([^]*?)(<\/div>|$)/gi
。。它还匹配没有结束标记的内容
完全匹配:
<div class="panel-body">
<a href="#">Link</a>
Line 1
Line 2
Line 3
</div>
<div class="panel-body">
<a href="#">Link</a>
Line 1
Line 2
Line 3
Don't match after closing `div`...but match this and below in case closing `div` is removed.
Line below 1
Line below 2
Line below 3
*注意:由于它是渐进式输出,所以在满负载之前它不会关闭
编辑2:
在公布答案后,我进行了速度对比测试。这取决于你,谁的解决方案最适合你
如果没有标记,则可以使用-all line not start by
(^|\r|\n|\r\n)[^<]+
(^ |\r |\n |\r\n)[^我还不能发表评论,所以我将尝试回答。非捕获组如何,您仍然拥有完整的匹配项,但匹配项中唯一的条目是内容。因此索引0
(?:<div class="panel-body">)([^]*?)(?:<\/div>|$)
(?:)([^]*?)(?:|$)
您可以使用DOM
解析器,该解析器还应包含不完整的标记:
函数divContent(str){
//创建一个新的dov容器
var div=document.createElement('div');
//将HTML分配给div的innerHTML
div.innerHTML=''+str+'';
//按给定的类名查找元素
var el=div.getElementsByClassName(“面板主体”);
//返回找到的元素的第一个innerHTML
返回(el.length>0?el[el.length-1]。innerHTML:);
}
//从完整标记中提取文本:
变量html=`
第1行
第2行
第3行
`;
log(divContent(html));
//从不完整的标记中提取文本:
html=`
第1行
第2行
第3行
结束“div”后不匹配…但匹配此项和以下项
如果关闭“div”被删除。
1以下的行
第2行以下
3〃以下的线;
log(divContent(html));
//OP'e编辑的HTML文本
html=`
centos.centos上的Webmin 1.851(centos Linux 7.3.1611)
`;
console.log(divContent(html));
它必须是一个regexp吗?您可以只查找开始标记,也可以删除结束标记(如果存在):
function parseContent(input) {
var openingTag = '<div class="panel-body">';
var i = input.indexOf(openingTag);
if (i == -1) {
return ""; // Or something else
}
var closingTag = '</div>';
var closingTagLength = closingTag.length;
var end = input.length - (input.slice(-closingTagLength) === closingTag ? closingTagLength : 0);
return input.slice(i + openingTag.length, end);
}
您不能忽略起始部分,因为这仅适用于JS不支持的lookbehinds
@georg我认为是这样,但想再次检查。然后只有选项1仍然有效。我知道你只想要正则表达式答案,但使用DOM
可以很容易地解决这个问题。@anubhava嗨,正则表达式大师!:)你说使用DOM
到底是什么意思?我的意思是:它不起作用,因为它包含其他标记。我更新了我的问题在上,将其他标记元素添加到容器中。这是不正确的regex101.com/r/ev7jd1/1-它与
标记之外的内容匹配。这太可怕了,对不起,伙计,没有冒犯的意思。你不是认真的,我知道!:)这一次我投了反对票。不需要第一个非捕获组。它比regex快吗?大小随着每个请求不断增长。这是p渐进式输出。然后正则表达式或非正则表达式解决方案在某一点后都会变慢。它不是从这个
开始的。它是从常规的HTML5页面开始的。您的示例是否可以处理所有未关闭的div
标记,而不提及主体和html
?是的,这是由DOM模块。这不应该有害,事实上是有益的。这是一个有趣的解决方案。我喜欢它。你认为indexOf()吗
将比regex
快?但是,它与结束div
标记外的文本匹配。看看:你真的需要担心速度吗?AJAX请求将花费很长时间,不同解析解决方案之间的几毫秒差将可以忽略。除此之外,请检查我的编辑。实际上它是mu渐进式输出的速度更快。理论上,这都是关于可能达到兆字节的数据量。例如,它是如何工作的。这都是SPA:。indexOf()
似乎是最快的。
\<[^div] ([^\r\n]*\n)+Line 3
(?:<div class="panel-body">)([^]*?)(?:<\/div>|$)
function parseContent(input) {
var openingTag = '<div class="panel-body">';
var i = input.indexOf(openingTag);
if (i == -1) {
return ""; // Or something else
}
var closingTag = '</div>';
var closingTagLength = closingTag.length;
var end = input.length - (input.slice(-closingTagLength) === closingTag ? closingTagLength : 0);
return input.slice(i + openingTag.length, end);
}
function parseContent(input) {
var openingTag = '<div class="panel-body">';
var i = input.indexOf(openingTag);
if (i == -1) {
return ""; // Or something else
}
var closingTag = '</div>';
var endIndex = input.indexOf(closingTag, i);
var end = (endIndex === -1 ? input.length : endIndex);
return input.slice(i + openingTag.length, end);
}