PHP中strip_tags处理特定字符串时失效的问题求助
嘿,这个问题我之前也踩过坑!咱们先捋捋情况:平时用PHP的strip_tags()清理HTML标签都挺顺手的,不管是<script>、<style>还是<div>这些标签都能正常处理,但这次碰到个特殊字符串,这函数居然直接“罢工”了,属实头疼!
先看看你用到的这段代码:
$string = ' <div>BEGINNING</div> <script> for (let i=0;i<resultado4448.length;i++) { } </script> <div>END</div> '; echo strip_tags($string);
为啥会出问题呢?其实是strip_tags()的工作机制导致的——它只会机械地把<字符当作HTML标签的起始,完全没法区分这个<是JavaScript里的比较运算符,还是真的HTML标签开头。碰到你这段代码里的i<resultado4448.length,它直接把这个<当成了新标签的开始,然后一直找对应的>来闭合,结果把<script>标签里剩下的内容、甚至后面的</script>和<div>END</div>都当成了要剥离的标签内容,输出自然就不对了。
给你两个实用的解决办法:
- 用
DOMDocument解析处理(这是最稳妥的方案,能正确识别HTML结构和脚本内容):$string = ' <div>BEGINNING</div> <script> for (let i=0;i<resultado4448.length;i++) { } </script> <div>END</div> '; // 初始化DOM文档 $dom = new DOMDocument(); // 忽略HTML解析时的警告(避免格式不规范引发的报错) libxml_use_internal_errors(true); $dom->loadHTML($string); libxml_clear_errors(); // 用XPath定位所有script标签并删除 $xpath = new DOMXPath($dom); foreach ($xpath->query('//script') as $scriptTag) { $scriptTag->parentNode->removeChild($scriptTag); } // 提取并输出纯文本内容 echo trim($dom->textContent); - 要是你只需要处理这种简单场景,也可以用临时替换的hack写法(只适合特定情况,通用性不如DOM方案):
$string = ' <div>BEGINNING</div> <script> for (let i=0;i<resultado4448.length;i++) { } </script> <div>END</div> '; // 临时替换script标签内的<为占位符 $string = preg_replace_callback('/<script[^>]*>(.*?)<\/script>/is', function($matches) { return str_replace('<', 'TEMP_LT', $matches[0]); }, $string); // 执行strip_tags清理 $result = strip_tags($string); // 还原占位符 $result = str_replace('TEMP_LT', '<', $result); echo trim($result);
备注:内容来源于stack exchange,提问作者Sitepor500.com.br
相关产品推荐
相关产品推荐

