PHP如何移除pre标签外的所有HTML标签?
解决PHP中移除pre标签外部HTML标签的问题
你遇到的核心问题是strip_tags()是全局生效的——它会过滤掉所有不在允许列表里的标签,包括pre内部的标签,所以没法单独保留pre内部的HTML结构。下面给两种可行的解决方法:
方法一:用DOMDocument解析(推荐,适用于复杂HTML)
DOM解析是处理HTML最可靠的方式,能精准区分pre内外的内容:
$string = '<p>someText</p><li>someText</li><pre><p>someText</p></pre>'; // 初始化DOM并加载HTML,避免自动添加html/body标签 $dom = new DOMDocument(); libxml_use_internal_errors(true); // 忽略HTML解析警告 $dom->loadHTML($string, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); libxml_clear_errors(); $result = ''; // 遍历所有顶级节点 foreach ($dom->childNodes as $node) { if ($node instanceof DOMElement) { if ($node->tagName === 'pre') { // 完整保留pre标签及其内部所有内容 $result .= $dom->saveHTML($node); } else { // 提取其他标签的文本内容(去掉标签) $result .= $node->textContent; } } elseif ($node instanceof DOMText) { // 直接保留纯文本节点 $result .= $node->textContent; } } echo $result; // 输出:someTextsomeText<pre><p>someText</p></pre>
方法二:正则+占位符(适用于简单、规范的HTML)
如果你的HTML结构比较简单(pre标签不嵌套、格式规范),可以用占位符先把pre内容暂存,处理完外部标签后再恢复:
$string = '<p>someText</p><li>someText</li><pre><p>someText</p></pre>'; // 1. 提取所有pre标签及其内容 preg_match_all('/(<pre>.*?<\/pre>)/s', $string, $preMatches); // 2. 用占位符替换原字符串中的pre部分 $tempStr = preg_replace('/<pre>.*?<\/pre>/s', '###TEMP_PRE###', $string); // 3. 去掉外部所有HTML标签 $tempStr = strip_tags($tempStr); // 4. 把占位符替换回原来的pre内容 $result = str_replace('###TEMP_PRE###', $preMatches[0][0], $tempStr); echo $result; // 输出预期结果
为什么strip_tags不行?
strip_tags($string, '<pre>')会把所有非pre标签都过滤掉,包括pre内部的<p>标签,最终得到的是someTextsomeText<pre>someText</pre>,不符合你保留pre内部HTML的需求。
内容的提问来源于stack exchange,提问作者pccamp
相关产品推荐
相关产品推荐

