
本文介绍在 php 中使用正则表达式安全、准确地提取 class 属性中包含指定关键词(如 "egg")的 `` 标签内的文本内容,并提供可直接运行的代码示例与关键注意事项。
在实际 Web 开发中,我们常需从 HTML 片段中提取特定语义的内容,例如仅获取 class 属性中包含 "egg" 的 标签所包裹的文本。原始尝试的正则 (?).+?(?=) 存在严重逻辑缺陷:它错误地将 | 视为“或”分支,导致匹配锚点混乱(如匹配到 "|egg|"> 中任意单字符),进而捕获了大量无关字符串。
正确的思路是:定位标签结构本身,再捕获其内部内容。推荐使用以下正则表达式:
/<span class=".*?egg.*?">(.+?)<\/span>/
- ">:匹配属性结束与标签闭合的引号和 >;
- (.+?):核心捕获组,非贪婪匹配标签内任意内容(即目标文本);
- :字面量匹配闭合标签(注意 / 转义)。
✅ 完整 PHP 示例(可直接运行):
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
$text = 'I ate a <span class="egg">boiled egg</span> and <span class="ham">ham</span>. I ate a <span class="egg ham">ham and eggs</span>.';
preg_match_all('/<span class=".*?egg.*?">(.+?)<\/span>/', $text, $matches);
// $matches[1] 是第一个捕获组——即所有匹配的标签内容
if (!empty($matches[1])) {
foreach ($matches[1] as $content) {
echo trim($content) . "\n";
}
}
// 输出:
// boiled egg
// ham and eggs⚠️ 重要注意事项:
立即学习“前端免费学习笔记(深入)”;
- 正则不适用于复杂 HTML:若 HTML 存在嵌套 、属性换行、注释或非法结构,正则易失效。生产环境强烈建议使用 DOM 解析器(如 DOMDocument + XPath);
- 避免过度贪婪:务必使用 .*?(非贪婪)而非 .*,否则可能跨标签匹配;
- 转义字符:在 PHP 字符串中, 的 / 需转义为 ,或改用其他分隔符(如 #(.*?)#);
- 编码与特殊字符:若内容含 HTML 实体(如 &),需额外调用 html_entity_decode() 处理;
- 性能考量:对超长文本频繁执行正则可能影响性能,建议结合缓存或预处理。
总结:该正则方案简洁高效,适用于结构清晰、可控的 HTML 片段提取场景。牢记“正则处理 HTML 有风险”,简单需求可快速落地,复杂场景请转向专业解析器。


















