使用正则表达式来匹配具有特定ID的div块[重复]

2023-12-04

我正在尝试匹配具有特定 id 的 div 块。这是我的正则表达式代码:

<div\s+[^>]*\s*id\s*=\s*["|']content["|']\s*>[^/div]+

我希望正则表达式匹配整个 div 块。所以我把 [^/div]+ 放在我的正则表达式中,我假设它将匹配剩余的字符,直到它到达结尾,但它直到最后才匹配,因为 [^] 表达式认为我不想要匹配任何 。我想要的是将整个事情作为一个整体来考虑。放置 [^()] 也没有帮助..

所以请告诉我应该如何编码这个问题

<div id="content">
    <noscript></noscript>
    <a href="blabla.com">
    <h1>
       <a href="blablac.com">Blablabla</a>
    </h1>
</div>

免责声明:一般来说,正则表达式不是最好的工具parsingHTML。然而,PCRE 库(由 PHP 使用)preg_*()函数族),确实允许解决诸如此类的重要数据抓取问题(有一些限制和警告 - 见下文)。单独使用正则表达式解决上述问题特别复杂,并且如下所示的正则表达式解决方案并不适合所有人,应该never由正则表达式新手尝试。要正确理解下面的答案,需要对几种高级正则表达式结构和技术有相当深入的理解。

考虑到这一点,如果您想了解如何设计高级正则表达式来解决这个问题(对于除少数(不太可能)特殊情况之外的所有情况 - 请参阅下面的示例),请继续阅读...

高级递归正则表达式解决方案:正如韦斯·哈德克(Wes Hardaker)正确指出的那样,DIVs 可以(并且经常)嵌套。然而,他说的并不是100%正确“在正确的 之前你无法构建一个匹配的”。事实是,使用 PHP,you can!(有一些限制 - 见下文)。与 Perl 和 .NET 一样,PHP 中的 PCRE 正则表达式引擎提供递归表达式(即(?R), (?1), (?2)等),允许将嵌套结构匹配到任意深度(仅受内存限制)。例如,您可以轻松地将平衡嵌套括号与以下表达式匹配:'/\((?:[^()]++|(?R))*+\)/'。如果您有任何疑问,请运行这个简单的测试:

$text = 'zero(one(two)one(two(three)two)one)zero';
if (preg_match('/\((?:[^()]++|(?R))*+\)/', $text, $matches)) {
    print_r($matches);
}

因此,如果我们都同意 PHP 正则表达式确实可以匹配嵌套结构,那么让我们继续解决当前的问题。这个特殊的问题由于最外层的事实而变得复杂DIV必须有id="content"属性,但任何嵌套DIV可能会也可能不会。因此,我们不能使用(?R) 递归匹配整个表达式构造,因为匹配外部 DIV 的子表达式与匹配内部 DIV 所需的子表达式不同DIVs。在这种情况下,我们需要有一个捕获组(在本例中为组 2),它将用作“递归子程序”,匹配内部、嵌套DIV的。这是一个经过测试的 PHP 代码片段,具有高级功能不是为了胆小的人,而是为了让你能够真正理解它正则表达式,它正确匹配(在大多数情况下 - 见下文),aDIV having id="content",它本身可能包含嵌套DIVs:

$re = '% # Match a DIV element having id="content".
    <div\b             # Start of outer DIV start tag.
    [^>]*?             # Lazily match up to id attrib.
    \bid\s*+=\s*+      # id attribute name and =
    ([\'"]?+)          # $1: Optional quote delimiter.
    \bcontent\b        # specific ID to be matched.
    (?(1)\1)           # If open quote, match same closing quote
    [^>]*+>            # remaining outer DIV start tag.
    (                  # $2: DIV contents. (may be called recursively!)
      (?:              # Non-capture group for DIV contents alternatives.
      # DIV contents option 1: All non-DIV, non-comment stuff...
        [^<]++         # One or more non-tag, non-comment characters.
      # DIV contents option 2: Start of a non-DIV tag...
      | <            # Match a "<", but only if it
        (?!          # is not the beginning of either
          /?div\b    # a DIV start or end tag,
        | !--        # or an HTML comment.
        )            # Ok, that < was not a DIV or comment.
      # DIV contents Option 3: an HTML comment.
      | <!--.*?-->     # A non-SGML compliant HTML comment.
      # DIV contents Option 4: a nested DIV element!
      | <div\b[^>]*+>  # Inner DIV element start tag.
        (?2)           # Recurse group 2 as a nested subroutine.
        </div\s*>      # Inner DIV element end tag.
      )*+              # Zero or more of these contents alternatives.
    )                  # End 2$: DIV contents.
    </div\s*>          # Outer DIV end tag.
    %isx';
if (preg_match($re, $text, $matches)) {
    printf("Match found:\n%s\n", $matches[0]);
}

正如我所说,这个正则表达式非常复杂,但请放心,它确实有效!除了下面提到的一些不太可能发生的情况 - (如果您能找到,我可能会非常感激)。尝试一下,亲自看看!

我应该用这个吗?在必须以 100% 可靠性和准确性解析数百或数千个文档的生产环境中使用此正则表达式解决方案是否合适?当然不是。它对于某些 HTML 文件的有限一次性运行有用吗? (例如,可能是问这个问题的人?)可能。这取决于人们对高级正则表达式的适应程度。如果上面的正则表达式看起来像是用外语编写的(确实如此),并且/或者让您感到害怕,那么答案可能是否定的。

有用?是的。例如,给定以下测试数据,上面的正则表达式正确地挑选出DIV拥有id="content" (or id='content' or id=content对于这个问题):

<!DOCTYPE HTML SYSTEM>
<html>
<head><title>Test Page</title></head>
<body>
<div id="non-content-div">
    <h1>PCRE does recursion!</h1>
    <div id='content'>
        <h2>First level matched</h2>
        <!-- this comment </div> is tricky -->
        <div id="one-deep">
            <h3>Second level matched</h3>
            <div id=two-deep>
                <h4>Third level matched</h4>
                <div id=three-deep>
                    <h4>Fourth level matched</h4>
                </div>
                <p>stuff</p>
            </div>
            <!-- this comment <div> is tricky -->
            <p>stuff</p>
        </div>
        <p>stuff</p>
    </div>
    <p>stuff</p>
</div>
<p>stuff</p>
</body></html>

CAVEATS:那么这个解决方案在哪些场景下不起作用呢?出色地,DIV开始标签的任何属性中都不能有任何尖括号(可以消除此限制,但这会给代码增加相当多的内容)。以及以下内容CDATA跨度,其中包含特定的DIV我们正在寻找的开始标记(极不可能)将导致正则表达式失败:

<style type="text/css">
p:before {
    content: 'Unlikely CSS string with <div id=content> in it.';
}
</style>
<p title="Unlikely attribute with a <div id=content> in it">stuff</p>
<script type="text/javascript">
    alert("evil script with <div id=content> in it">");
</script>
<!-- Comment with <div id="content"> in it -->
<![CDATA[ a CDATA section with <div id="content"> in it ]]>

我非常想了解其他人。

去阅读 MRE3正如我之前所说,要真正掌握这里发生的事情,需要对几种先进技术有相当深入的了解。这些技术并不明显或直观。据我所知,获得这些技能的方法只有一种,那就是坐下来学习:掌握正则表达式(第三版)作者:杰弗里·弗里德尔 (MRE3)。 (你会很高兴你这么做了!)

我可以诚实地说这是我一生中读过的最有用的书!

编辑2013-04-30修复了正则表达式。此前它不允许非DIV紧随其后的标签DIV开始标记。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用正则表达式来匹配具有特定ID的div块[重复] 的相关文章

  • 无法使用 BeautifulSoup4 (Python 3) 抓取特定表

    我想从 Ligue 1 足球网站上抓取一张表格 具体来说 该表包含有关卡片和裁判的信息 http www ligue1 com LFPStats stats arbitre competition D1 http www ligue1 co
  • 如何解码 eval( gzinflate( base64_decode(

    我已将此代码注入到我的网站中 如何解码尾随字符串 我需要知道发生了什么以及其背后的代码是什么 这应该输出将被执行的代码eval 我希望这就是您正在寻找的
  • Magento - 检查 cms 页面

    我想通过 php 检查页面是否是 Magento 中的 cms page 我需要不同的 cms 页面面包屑 所以我尝试在一个条件下做到这一点 但我不知道如何或在哪里查看 到目前为止 这是我的 breadcrumbs phtml p some
  • 浮动图像周围具有最小列宽的流动文本

    我想要一种方法来防止流动文本列变得太窄 例如 在一列 HTML 文本中 有一个图像浮动到左侧 正如预期的那样 文本沿着图像周围的列的右侧向下流动 但是 如果图像几乎与列一样宽 则文本最终会非常窄 在这种情况下 我希望文本简单地not流过图像
  • 防止垃圾邮件按钮呼叫功能

    如何防止调用函数时出现垃圾邮件按钮 就像用户只能在按钮上每 1 秒调用一次该函数 有办法做到吗 因为我尝试了 setTimeout 但没有成功 它仍然在发送垃圾邮件 顺便说一句 我使用 Jquery 这是我的代码
  • 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

    我想允许用户从两个不同的模型登录 配置文件 user gt identityClass gt app models User one more class here enableAutoLogin gt false authTimeout
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • 强制 Composer 下载 git repo 而不是 zip

    我对作曲家有一些问题 require php gt 5 3 2 kriswallsmith buzz 0 7 Repo https github com kriswallsmith Buzz tree v0 7 https github c
  • apache_request_headers() 与 $_SERVER

    据我所知 apache request headers 提供与以下相同的信息 SERVER 但按键略有不同 为什么有人应该使用apache request headers 而不仅仅是从那里获取这些信息 SERVER 我在 Centos 上使
  • JavaScript RegEx:不同的结果:使用字符串和使用正则表达式“文字”构建模式?

    使用 RegExp 文字与字符串之间有什么区别吗 http jsfiddle net yMMrk http jsfiddle net yMMrk String prototype lastIndexOf function pattern p
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • 为什么我的交互式图像仅在 Internet Explorer 上出现故障?

    我的问题 我为自己制作了一个图像地图 交互式图像 它在 Chrome safari 和 Firefox 上完美运行 然而 当我在可怕的互联网浏览器上尝试它时 它真的很糟糕 这些小点应该扩展到更大的盒子中 在互联网浏览器上它要么不起作用 要么
  • 具有 100% 高度行和 Internet Explorer 9 的表格

    我有以下示例 div style height 150px background color AAAAFF div
  • 使用 Javascript 设置 cookie [重复]

    这个问题在这里已经有答案了 我正在尝试构建我的第一个移动应用程序 它需要连接到我的 mysql 数据库并使用 json 返回数据 这很好 目前我有一个登录系统 一旦确定用户名和密码存在 它就会返回一条成功消息 对于下一步 我想在我的页面上使
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 如何使用 XPath 正则表达式匹配 URL

    需要 XPath 方面的帮助 我有这样一个XML
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2

随机推荐

  • ng-src 不适用于 youtube 嵌入视频

    我对 YouTube 嵌入代码有一个小问题 在我的控制器中 scope emedUrl https www youtube com embed
  • Python 中的多态性

    class File object def init self filename if os path isfile filename self filename filename self file open filename rb se
  • 手动响应鼠标悬停事件

    有没有办法触发 React 的 mouseover 和 mouseenter 事件 可以开火 ReactDOM findDOMNode someNode focus ReactDOM findDOMNode someNode click 有
  • PHP 找不到保存处理程序内存缓存

    我正在为这个问题绞尽脑汁 它应该很简单 但似乎找不到解决方案 所以希望你们中的一个人可以帮助我 我正在尝试使用 php 的 memcache 扩展来存储会话 我正在运行 MAMP 并已正确安装了扩展 我认为 它在我执行 phpinfo 时显
  • JPA中NamedQuery注解有什么好处?

    刚才我写了一个NamedQuery对于 JPA 实体 我们对此感到非常高兴 这里是 NamedQuery name Panties RED PANTIES QRY query SELECT p FROM Panties p WHERE p
  • 使用 iTextSharp 在 VB.NET 中读取 PDF 书签

    我正在制作一个工具 可以扫描 PDF 文件并搜索 PDF 书签和正文中的文本 我正在使用带有 VB NET 和 iTextSharp 的 Visual Studio 2008 如何从现有 PDF 文件加载书签列表 这取决于您所说的 书签 时
  • 如何找到采样边界内的最大圆?

    给定一组二维点 这些点是不规则形状的边界 该形状可能不是凸的并且可能有内孔 是否有一种算法可以找到适合边界的最大圆 我已经做了很多搜索 并且确实找到了接近的算法 例如最大的空圆问题 但到目前为止我发现没有一个与我所拥有的约束相匹配 动机 由
  • 将两行文本传递到InputBox中

    我的代码中有以下行要求用户输入 strFind InputBox Please enter the text to look for Replace Text in Files 我需要用户输入由 LF 或 CR 或 CRLF 换行符 分隔的
  • 为什么协议中的仅获取属性要求不能通过符合的属性来满足?

    为什么下面的代码会产生错误 protocol ProtocolA var someProperty ProtocolB get protocol ProtocolB class ConformsToB ProtocolB class Som
  • 在 WP7 中反序列化 JSON

    我有这个 JSON 我正在尝试在 Windows Phone 上读取它 我一直在玩DataContractJsonSerializer和 Json NET 但运气不太好 尤其是阅读每个 条目 lastUpdated 16 12 filter
  • 如何用SQL-Server 2000查询层次信息?

    我有一张桌子Folders包含有关文件夹的分层信息 FolderID FolderName ParentID 1 Folder1 0 2 Folder2 1 3 Folder3 2 4 Folder4 3 For Folder4我想获取以下
  • Android MapView 无法删除标记

    我正在使用 locationManager 和 ItemizedOverlay 来绘制 我的位置 标记 问题是当触发 onLocationChanged 时 我正在绘制新标记 而不是最后一个移动到新位置的标记 这是我的 onLocation
  • 如何正确清理 Excel 互操作对象?

    我在 C 中使用 Excel 互操作 ApplicationClass 并将以下代码放入我的finally子句中 while System Runtime InteropServices Marshal ReleaseComObject e
  • jQuery 按需加载图像

    我正在尝试按需加载图像 以防止下载不需要的图像 我正在使用 jQuery 到目前为止 这就是我想出的 region image attr src images e key jpg load function this fadeIn e ke
  • 如何避免在接口中重复使用相同的实现代码?

    首先 我为 又一个界面问题 道歉 不过 我认为这个问题可能值得一问 因为这是一个奇怪的问题 我正在使用的项目使用 Actionscript 3 但这更多是一个一般的 OOP 问题 情况是这样的 我有一个已经从基类继承的类 它是电子游戏中的一
  • Spring Data JDBC:DataRetrievalFailureException:无法将 [oracle.sql.ROWID] 转换为 [java.lang.Number]

    我是 Spring Data JDBC 的新手 我正在努力创建一个简单的 Dto 并将其持久保存在数据库上 我正在使用 Spring Boot 2 1 1 RELEASE 和 Oracle 12 数据库 UserDto Table valu
  • 如何使 std::istream_iterator 只读直到行尾?

    有以下代码 std vector
  • 如何保持打开的 xml 文档的样式

    我使用开放 XML Microsoft Word docx 作为文件模板来自动生成其他文档 在模板文档中 我定义了内容控件 并编写了代码来替换这些内容控件中的内容 内容被替换并生成文档 但我正在努力保持风格 在Word中 在检查内容控件的属
  • 将一个 div 放在两个垂直 div 旁边

    我试图让一个 div 在其容器中的高度为 100 其高度为 50 并在其旁边有两个 div 每个 div 的高度为 50 这是我的意思的一个例子 我还想在所有 div 之间留有边距 如上图所示 到目前为止 这是我的代码 div style
  • 使用正则表达式来匹配具有特定ID的div块[重复]

    这个问题在这里已经有答案了 我正在尝试匹配具有特定 id 的 div 块 这是我的正则表达式代码