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

求助:使用Regex限制提取含属性的HTML段落

解决HTML段落提取问题的两种方案

我明白你头疼的点——自动生成的HTML段落总是带各种属性,正则写不好就抓不到或者抓错内容。下面给你两种实用方案,按需选就行:

方案1:用正则快速提取(适合结构简单的HTML)

如果你的HTML段落结构不复杂(没有嵌套的块级标签),正则完全够用。

提取完整的

标签(包含所有属性)

正则表达式:/<p\b[^>]*>(.*?)<\/p>/si

  • <p\b>:匹配<p>标签开头,\b是单词边界,防止误匹配<picture>这类带p的标签
  • [^>]*:匹配<p>标签里的任意属性(比如attribute="value"),直到遇到>
  • (.*?):非贪婪匹配标签内的所有内容(包括换行)
  • si修饰符:s让.能匹配换行,i忽略大小写(可选,比如匹配<P>标签)

示例代码:

$html = '<p>Paragraph 1</p> <p attribute="value">Paragraph 2</p><p class="test">Paragraph with<br>a line break</p>';

// 提取所有完整的<p>标签
preg_match_all('/<p\b[^>]*>(.*?)<\/p>/si', $html, $matches);
$fullParagraphTags = $matches[0];

// 输出结果
foreach ($fullParagraphTags as $tag) {
    echo $tag . "\n";
}

仅提取段落文本内容

上面的正则里,$matches[1]就是每个<p>标签内的文本内容(包括里面的行内标签比如<br>),如果要纯文本(去掉所有行内标签),可以再加一步strip_tags():

// 提取文本内容(保留行内标签)
$rawText = $matches[1];
// 提取纯文本(去掉所有标签)
$plainText = array_map('strip_tags', $rawText);

// 输出纯文本
foreach ($plainText as $text) {
    echo $text . "\n";
}

方案2:用DOM扩展解析(更稳定,适合复杂HTML)

如果你的HTML有嵌套标签、不规范的写法,正则很容易失效,这时候用PHP的DOMDocument是更靠谱的选择:

示例代码:

$html = '<p>Paragraph 1</p> <p attribute="value">Paragraph 2</p><p class="test">Paragraph with<br>a line break</p>';

$dom = new DOMDocument();
// 忽略HTML解析时的错误(避免因为不规范HTML报错)
libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_clear_errors();

// 用XPath查找所有<p>标签
$xpath = new DOMXPath($dom);
$pElements = $xpath->query('//p');

// 获取完整的<p>标签(包含属性)
foreach ($pElements as $p) {
    echo $dom->saveHTML($p) . "\n";
}

// 获取纯文本内容
echo "\n--- 仅文本内容 ---\n";
foreach ($pElements as $p) {
    echo $p->textContent . "\n";
}

这个方法不管<p>标签有多少属性、里面嵌套了什么行内标签,都能准确提取,完全不用纠结正则的边界问题。

内容的提问来源于stack exchange,提问作者eL-Prova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:59:12