PHP中如何仅转译非HTML标签的尖括号为HTML实体?
解决PHP中保留HTML标签并转义文本内尖括号的问题
直接用PHP内置的DOMDocument结合DOMXPath就能精准解决这个需求——通过遍历所有文本节点,只对文本内容里的尖括号转义,完全保留原有HTML标签结构,比正则和HTMLPurifier更贴合你的需求。
具体实现代码
function escapeTextAngleBrackets($html) { $dom = new DOMDocument(); // 关闭XML错误提示,避免解析非标准HTML时报错 libxml_use_internal_errors(true); // 加载HTML时避免自动补全DOCTYPE、html/body标签 $dom->loadHTML('<?xml encoding="UTF-8">' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); $xpath = new DOMXPath($dom); // 定位所有文本节点 $textNodes = $xpath->query('//text()'); foreach ($textNodes as $node) { $originalText = $node->nodeValue; // 仅转义文本中的<和>为HTML实体 $escapedText = str_replace(['<', '>'], ['<', '>'], $originalText); $node->nodeValue = $escapedText; } return $dom->saveHTML(); } // 测试示例 $inputHtml = '<p> sample text with equation like b<a or text <inside> brackets </p>'; echo escapeTextAngleBrackets($inputHtml);
关键细节说明
- 避免自动补全标签:使用
LIBXML_HTML_NOIMPLIED和LIBXML_HTML_NODEFDTD参数,防止DOMDocument自动给你的HTML片段添加多余的<html>、<body>或DOCTYPE声明。 - 精准处理文本节点:通过XPath的
//text()查询,只获取HTML中的纯文本内容,不会触碰任何标签节点,从根源上保证标签不受改动。 - 编码兼容:加载HTML前添加
<?xml encoding="UTF-8">声明,确保中文等非ASCII字符不会出现乱码问题。
效果验证
输入你提供的示例内容后,输出结果会是:
<p> sample text with equation like b<a or text <inside> brackets </p>
完全保留了<p>标签,同时把文本里的b<a和<inside>中的尖括号转成了实体,符合你的需求。
内容的提问来源于stack exchange,提问作者user2531657
相关产品推荐
相关产品推荐

