推荐用 preg_replace('//i', '', $html) 去标签,因其可控性强;strip_tags() 易误删含 ↩

用 preg_replace 去掉 HTML 标签但保留文本内容
直接用 preg_replace 匹配并移除成对标签(如 <p>xxx</p>)或自闭合标签(如 <br>),是最常用也最可控的方式。正则模式要兼顾常见变体:大小写、属性、空格、换行。
推荐模式:/]*>/i
匹配可选的 <code>/(开/闭标签通用)-
[a-zA-Z]确保至少一个字母开头(排除纯注释或非法标记) -
[^>]*容忍任意属性和空格,但不跨标签 -
>严格匹配结束尖括号 -
i修饰符保证大小写不敏感
示例:
$html = '<p class="intro">Hello <strong>World</strong>!</p>';<br>$text = preg_replace('/]*>/i', '', $html);<br>// 结果:'Hello World!'
为什么不用 strip_tags()?它在什么场景下会出问题
strip_tags() 看似更简单,但它会误删合法内容:遇到未闭合标签、嵌套错误或含 的文本时行为不可控。比如 <code><div>5 < 10</div> 中的 < 可能被截断,导致输出变成 5 (后面内容丢失)。
- 它不解析 HTML 结构,只做字符串扫描,遇到第一个
就开始“吃掉”,直到下一个 <code>>,哪怕中间是纯文本 - 无法处理实体编码(如
<、>)与标签混用的情况 - 不支持白名单过滤——若你只想留
<p></p>和<em></em>,它做不到
所以,当输入 HTML 来源不可信、结构不规范,或你需要精细控制替换逻辑时,preg_replace 更可靠。
处理换行、多余空白和内联样式残留
仅去掉标签后,原文本常出现连续空格、换行符堆积,或残留 style="display:none" 类属性(虽已无标签,但属性字符串还在)。这不是正则没写好,而是因为你的模式没覆盖这些内容。
- 如果原始 HTML 含大量换行缩进,替换后可能得到
"\n Hello\n World\n "—— 建议后续用trim()+preg_replace('/\s+/', ' ', $text)整理空白 - 若需清除内联样式残留(比如
<span style="color:red">Text</span>被替换成style="color:red"Text),说明你的正则太宽松,漏掉了引号内内容;应改用更严格的模式,例如/]+))?)*\s*\/?>/i(注意性能下降) - 实际项目中,若 HTML 较复杂,优先考虑 DOM 解析(如
DOMDocument),而非硬扛正则
DOM 解析才是处理嵌套/不规范 HTML 的底线方案
当遇到 <b><i>hello</i></b> 这类错位嵌套,或含 CDATA、注释、HTML5 自定义元素时,正则基本失效。此时必须退到 DOMDocument。
示例:
$dom = new DOMDocument();<br>@$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);<br>$text = $dom->textContent;
-
@抑制解析警告(因 HTML 常不标准) -
LIBXML_HTML_NOIMPLIED防止自动补全 -
LIBXML_HTML_NODEFDTD避免插入 DTD 声明 -
$dom->textContent是最安全的纯文本提取方式,天然跳过注释、脚本、样式块
DOM 方案慢一点,但语义正确——正则只是字符串手术刀,DOM 才是真正“理解” HTML 的方式。别为了省几毫秒,把文本抽成乱码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











