You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP递归正则获取完整指定class的Div及其内部内容

解决正则提取嵌套Div的问题

我懂你的痛点——DOM解析出来的内容和源HTML在空格、标签细节上不一致,没法满足后续精确模式匹配的要求,所以只能硬着头皮用正则试试。你遇到的问题是因为普通的非贪婪匹配会在第一个</div>就终止,没法处理嵌套的HTML结构对吧?

递归正则方案

PHP的PCRE正则支持递归匹配,刚好可以解决这种嵌套标签的捕获问题。这里给你一个能精准提取目标div及其所有内部内容的正则示例:

$html = '<div class="not-want"> <div class="also-not-want"> <div class="want-this-entire-div-class"> <button class="dropdown-toggle search-trigger" data-toggle="dropdown"></button> <div class="dropdown-menu j-dropdown"> <div class="header-search"> <input type="text" name="search" value="" placeholder="Search entire site here..." class="search-input" data-category_id=""/> <button type="button" class="search-button" data-search-url="https://www.xxxxcom/index.php? route=product/search&amp;search="></button> </div> </div> </div> <div class="not-want-this-also"> <div class="or-this">';

// 使用递归正则匹配嵌套的目标div
preg_match('/<div class="want-this-entire-div-class"(?:[^>]*>)(?:(?:(?!<\/div>).|(?R))*)<\/div>/s', $html, $match);

// 输出匹配结果(用htmlspecialchars避免浏览器解析标签)
if (!empty($match[0])) {
    echo htmlspecialchars($match[0]);
}

正则逻辑解释

让我拆解一下这个正则的关键部分:

  • <div class="want-this-entire-div-class"(?:[^>]*>):精准匹配目标div的起始标签,(?:[^>]*)用来捕获标签内的其他属性(比如可能存在的id、style等),非捕获组不会干扰最终的匹配结果。
  • (?:(?:(?!<\/div>).|(?R))*):这是核心的递归匹配逻辑:
    • (?!<\/div>).:匹配任何不是</div>开头的单个字符
    • (?R):递归调用整个正则表达式,用来匹配嵌套在目标div内部的其他div结构
    • 两者结合就能完整遍历目标div内的所有内容,直到找到和起始标签对应的闭合</div>
  • <\/div>:匹配目标div的闭合标签
  • /s修饰符:让.可以匹配换行符,避免因为HTML换行导致匹配中断

注意事项

虽然这个方案能解决你当前的问题,但还是要提醒你:正则天生不适合处理HTML这种嵌套结构,如果后续源HTML出现注释、CDATA块,或者属性中包含</div>这类特殊字符串(虽然概率极低),正则可能会失效。如果有可能,还是建议你研究一下DOM解析时如何保留源HTML的原始格式——比如使用DOMDocument的preserveWhiteSpace和formatOutput属性调整,或者直接提取节点的outerHTML(不同PHP版本可能有差异)。但如果必须用正则,这个递归方案是目前最靠谱的选择。

内容的提问来源于stack exchange,提问作者Cookiesandcream

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:32:17