Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
改进JavaScript正则表达式,以匹配标记内部的内容,包括或不包括结束标记(self)_Javascript_Regex - Fatal编程技术网

改进JavaScript正则表达式,以匹配标记内部的内容,包括或不包括结束标记(self)

改进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&

前言:我知道大家普遍反对使用正则表达式解析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">
   <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);
}