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

PHP:如何替换孤立<为HTML实体并适配strip_tags?

解决孤立<被strip_tags误删的问题

正则调整方案

你的原正则匹配逻辑有缺陷,且未精准定位孤立<,调整后可以全局替换所有不构成合法HTML标签/注释的<为&#60;:

// 全局替换孤立<为&#60;,保留合法标签、闭合标签、注释的<
$processedString = preg_replace('/<(?!(?:[a-z]+\/?>|\/[a-z]+>|!--))/i', '&#60;', $string);

正则说明

  • <:匹配目标字符
  • (?!...):负向前瞻断言,确保<后面不是以下合法结构:
    • [a-z]+\/?>:普通标签(如<p>、<br/>)
    • \/[a-z]+>:闭合标签(如</p>)
    • !--:HTML注释起始(如<!-- Test -->)
  • /i:忽略大小写,兼容<P>这类大写标签
  • PHP的preg_replace默认全局匹配,无需额外加g修饰符

处理后再调用strip_tags($processedString),就能保留替换后的&#60;,同时移除所有合法HTML标签。

更优实现思路:用DOMDocument处理

正则处理HTML容易出现边界漏洞(比如嵌套标签、特殊属性值里的<),用DOM API能精准区分标签结构和文本内容,只替换文本中的孤立<:

$dom = new DOMDocument();
// 禁用HTML规范校验错误提示
libxml_use_internal_errors(true);
// 加载字符串,避免自动添加<html>/<body>标签
$dom->loadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
libxml_clear_errors();

// 遍历所有文本节点
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//text()') as $textNode) {
    // 替换文本中的<为&#60;
    $textNode->nodeValue = str_replace('<', '&#60;', $textNode->nodeValue);
}

// 提取处理后的HTML,再移除标签
$processedHtml = $dom->saveHTML();
$result = strip_tags($processedHtml);

优势

  • 精准区分标签和文本,不会误修改标签结构里的<
  • 自动兼容各种不规范HTML,避免正则漏判/误判
  • 代码可读性更强,维护成本低

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 05:13:39