首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >改进JavaScript正则表达式以匹配带有或不带结束标记的标记中的内容,不包括self

改进JavaScript正则表达式以匹配带有或不带结束标记的标记中的内容,不包括self
EN

Stack Overflow用户
提问于 2017-07-30 22:34:06
回答 4查看 297关注 0票数 4

前言:我知道大家普遍反对使用regex来解析HTML。请事先询问,请避免在这方面提出任何建议。

解释。

我有下面的正则表达式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/<div class="panel-body">([^]*?)(<\/div>|$)/gi

它将div中的所有内容(包括self )与类.panel-body相匹配。

完全匹配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div class="panel-body">
   <a href="#">Link</a>
   Line 1
   Line 2
   Line 3
</div>

。。它还匹配没有关闭的div标记的内容。

完全匹配:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<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

有个问题。

如何改进我的正则表达式以完成以下操作:

  1. 不包括在完全匹配<div class="panel-body">和关闭</div>中(当有关闭div标记时)
  2. 在不使用组的情况下(如果可能的话)直接完成整个比赛

regex101.com示例

编辑1:

字符串不是以<div class="panel-body">开头,而是以

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webmin 1.851 on centos.centos (CentOS Linux 7.3.1611)</title>
</head>
<body>
<div>
<div>
<div class="panel-body">

*注:直到满载时,它才会关闭,因为它是渐进输出。

编辑2:

贴出答案后,我做了速度比较测试。这取决于你,谁的解决方案对你最有利。

测速结果

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-30 23:21:16

您可以使用DOM解析器,也可以使用不完整的标记:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function divContent(str) {
  // create a new dov container
  var div = document.createElement('div');

  // assign your HTML to div's innerHTML
  div.innerHTML = '<html>' + str + '</html>';

  // find an element by given className
  var el = div.getElementsByClassName("panel-body");
  
  // return found element's first innerHTML
  return (el.length > 0 ? el[el.length-1].innerHTML : "");
}

// extract text from a complete tag:
var html = `<div class="panel-body">
   <a href="#">Link</a>
   Line 1
   Line 2
   Line 3
</div>`;
console.log(divContent(html));

// extract text from an incomplete tag:
html = `<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`;   
console.log(divContent(html));

// OP'e edited HTML text
html = `<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Webmin 1.851 on centos.centos (CentOS Linux 7.3.1611)</title>
</head>
<body>
<div>
<div>
<div class="panel-body">`;
console.log(divContent(html));

JS Fiddle

票数 3
EN

Stack Overflow用户

发布于 2017-07-30 23:02:17

我还不能发表评论,所以我会试着回答。非捕获组如何,您仍然在完全匹配,但您在比赛中的唯一条目将是内容。所以索引0。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(?:<div class="panel-body">)([^]*?)(?:<\/div>|$)

https://regex101.com/r/OJf1Rt/3

票数 2
EN

Stack Overflow用户

发布于 2017-07-31 00:40:50

一定要是正则表达式吗?您只需查找开始标记,可以选择删除结束标记,如果存在的话:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}

编辑:

如果在结束标记之后可以有文本,那么也可以使用indexOf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45408900

复制
相关文章
让控件填满整个页面
一般用于左侧的Frame,比如左侧放了一个树控件。用<body onload="FillPage('FlyTreeView1')" scroll=no>调用即可。     <script language="javascript" type="text/javascript">       //将ctlid控件填充满当前的页面,多用于frame中       function FillPage(ctlid)       {         var obj=document.getElementById(ct
用户1075292
2018/01/23
9470
让ZeGraph在X方向上填满
默认的效果是 希望能够在x方向上填满,两边不留。尝试出来的方法是:用zg1.GraphPane.XAxis.Scale.Max 和Min来设置,而且必须在画完图后设置。 zg1.GraphPane.C
用户1075292
2018/01/23
4840
让ZeGraph在X方向上填满
wpf wrapPanel居中并从左到右排列
参考文章.net – WPF – 如何将WrapPanel中的所有项目居中? – Thinbug
全栈程序员站长
2022/09/15
3760
Lua游戏开发参考资料收集
List of game engines that use lua: 2D Agen (Lua; Windows) Blitwizard (Lua; Windows, Linux, Mac) Cocos2d-x (C++/Lua/JS; Windows, Linux, Mac; iOS/Android/BlackBerry) Corona (Lua; Windows, Mac; iOS/Android) EGSL (Pascal/Lua; Windows, Linux, Mac, Haiku) G
meteoric
2018/11/19
8820
Video里的poster填满窗口的方案
用Video播放视频,视频能自适应屏幕大小,但是它的Poster(海报封面)继承了原尺寸比例,无法自动缩放或拉伸,不得技巧的话,很难处理。
IT晴天
2018/08/20
2K0
VUE.DRAGGABLE实现从左到右拖拽功能
1、左边【一级、二级、三级】字样是不能拖拽的,【item1、item2…】可以拖拽
青梅煮码
2023/03/02
1.2K0
设置图片的透明度从左到右渐变
一、设置图片的透明度从左到右渐变 /** * 设置图片的透明度从左到右渐变,使右边缘平滑过渡(注意只跟着x坐标变) * * @param num 范围为0-100,0为全透明,100为不透明 */ public static Bitmap getTransAlphaBitmap(Bitmap sourceImg, float num) { if (sourceImg == null) { return null;
用户9854323
2022/06/25
1.8K0
Excel小技巧40:自动填满单元格
在Excel中,可以使用你已经输入到单元格中的数据填满整个单元格,并且会随着单元格尺寸的调整而自动填充,如下图1所示。
fanjy
2020/06/28
3K0
Excel小技巧40:自动填满单元格
15种手机游戏引擎和开发工具介绍
工欲善其事,必先利其器。对移动游戏开发者来说,高效实用的开发工具必不可少。近日,英国著名产业杂志《Develop》刊出了一篇文章,作者艾伦·李在文中推荐了15种移动游戏开发工具,从游戏引擎,到音效制作、推广等工具都有涉及。以下为原文主要内容编译。
全栈程序员站长
2022/08/31
3.3K0
15种手机游戏引擎和开发工具介绍
RPA 实战:让小姐姐填满你的硬盘(上)
首先打开另一个小网站 -- https://www.hwtelcloud.com/products/rpa,下载【设计器】,并进行使用激活;下载【执行器】,让程序自己动;此外还需下载浏览器驱动和安装浏览器插件。关于软件的下载安装等此处就不进行讲解,相信您能搞定!
胡琦
2021/09/09
2K1
7个最优秀的手机游戏引擎
随着智能手机成为主要的游戏平台,移动游戏引擎变得越来越流行。 下面将介绍7个最优秀的手机游戏引擎。
全栈程序员站长
2022/09/06
5.5K0
设计分享|基于单片机的从左到右流水灯
51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得51系列单片机为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
电子工程师成长日记
2022/08/09
1.1K0
设计分享|基于单片机的从左到右流水灯
设计分享|基于单片机的从左到右流水灯
51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
电子工程师成长日记
2022/12/14
8840
设计分享|基于单片机的从左到右流水灯
Platform SDK、Windows SDK简介
Platform SDK及Windows SDK是由微软公司出品的一个软件开发包,向在微软的Windows操作系统和.NET框架上开发软件和网站的程序员提供头文件、库文件、示例代码、开发文档和开发工具。
全栈程序员站长
2022/09/05
3.8K0
Java开发SDK详解->SDK开发
File ——》 Project Structure ——》 Project Settings ——》 Artifacts ——》 右栏左上角+ ——》JAR ——》 From Modules with dependencies——》OK
全栈程序员站长
2022/09/08
5.6K0
填满Github的绿色格子用我做的VSCode插件-Auto Commit
如果提交到其他分支,提交记录不会显示在绿色的格子里面,合并分支之后 才会显示在绿色格子里面。
OBKoro1
2020/10/27
1.4K0
填满Github的绿色格子用我做的VSCode插件-Auto Commit
SDK之我理解的SDK
这是SDK系列的倒数第二篇,其实应该是第一篇来着。最近发现写了两个月还没写完,进度有点慢,这几天抓紧时间写完。不过随即发现当时完全没想错,这部分还是最难写。先写一个成稿,后续想到更多的内容逐步补充和更新吧。 什么是SDK SDK即软件开发工具包(外语首字母缩写:SDK、外语全称:Software Development Kit)一般都是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。 ​上面这是百度百科对SDK的定义。但是现实中我们开发的SDK更多的是Seco
子勰
2018/05/22
2.7K0
[大家的项目] alipay_sdk_rust,Alipay sdk in rust 支付宝支付 SDK
alipay官方没有rust sdk,本人自己实现了一个,已经生产环境可用。基于gostd的http模块。
MikeLoveRust
2022/11/28
1.7K0
[大家的项目] alipay_sdk_rust,Alipay sdk in rust 支付宝支付 SDK
教你如何填满过去一年的Github的绿色格子-Auto Commit
如果提交到其他分支,提交记录不会显示在绿色的格子里面,合并分支之后 才会显示在绿色格子里面。
OBKoro1
2020/01/13
3.6K0
点击加载更多

相似问题

corona sdk scrollableView

12

Corona SDK旋转

11

Corona sdk + xmpp

12

ScreenShot (CORONA SDK)

22

Corona SDK SplashScreen

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文