推荐用 DOMDocument 解析 HTML 提取文本,因其能正确处理嵌套、属性、注释等复杂情况;正则仅适用于简单场景,存在无法处理嵌套标签、CDATA、属性含>等问题。

<p>直接用 <strong>preg_match</strong> 提取 HTML 标签内的文本,核心是匹配开始标签、中间内容、结束标签,并捕获中间的文本部分。但要注意:正则处理 HTML 有局限性(比如嵌套标签、属性含 <code>></code>、注释、CDATA 等),简单场景可用,复杂结构推荐 DOM 解析器。</p>
<h3>基础写法:提取单个标签的纯文本</h3>
<p>例如提取 <code><p>Hello</p></code> 中的 <code>Hello</code>:</p>
<font color="#888">
<pre class="brush:php;toolbar:false;"><code>$html = '<p class="intro">Hello & welcome!</p>';
if (preg_match('/<p>]*>(.*?)/is', $html, $matches)) {
echo htmlspecialchars($matches[1]); // 输出:Hello & welcome!
}</p></code>
-
[^>]*防止匹配到标签内部的>,比.*?更安全 -
(.*?)非贪婪捕获标签之间内容(含 HTML 实体、空格、换行) -
i修饰符忽略大小写(匹配或) -
s修饰符让.匹配换行符
提取多个同名标签的内容
用 preg_match_all 获取所有匹配项:
<code>$html = '<div>第一段</div>
<div id="second">第二段</div>
<span>不是 div</span>';
preg_match_all('/<div>]*>(.*?)/is', $html, $matches);
// $matches[1] 是所有 div 标签内的文本数组
print_r($matches[1]); // ['第一段', '第二段']
<h3>更健壮一点:跳过含 script/style 的标签</h3>
<p>如果想排除 <code><script></script></code>、<code><style></style></code> 内容(避免误匹配),可加负向先行断言(需谨慎):</p>
<font color="#888">
<pre class="brush:php;toolbar:false;"><code>// 简单过滤:不匹配 script 和 style 开头的标签
preg_match_all('/]*>(.*?)/is', $html, $matches);</code>
-
(?!script|style)表示后面不能紧跟着script或style -
\1回溯引用,确保闭合标签和开始标签名一致(如)...
- 仍无法处理自闭合标签(
)、HTML 注释或属性里含>的情况
真正可靠的做法:用 DOMDocument
对任意合法 HTML,推荐用 PHP 原生 DOM:
<code>$dom = new DOMDocument();
libxml_use_internal_errors(true); // 忽略 HTML 警告
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
// 获取所有 p 标签的文本(自动解码 HTML 实体、忽略脚本内容)
$nodes = $xpath->query('//p');
foreach ($nodes as $node) {
echo trim($node->textContent) . "\n";
}</code>
- 自动处理编码、嵌套、属性、命名空间、CDN、注释等边界情况
-
textContent返回纯文本(不含子标签),nodeValue类似;若要保留内联标签,需遍历子节点 - 比正则更稳定,尤其面对用户输入或不可控 HTML 时
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











