PHP中如何移除字符串内的HTML标签及标签内部的内容?
实现方案
你可以选择以下两种方案处理读取到的字符串,整合到原有读取逻辑中即可:
方案1:正则快速处理(适合结构简单的文本)
适合处理无嵌套标签、标签结构规则的场景,代码简单执行速度快:
// 封装处理函数 function stripTagsWithContent(string $rawStr): string { // 匹配所有完整HTML标签(含自闭合标签)及内部内容,直接替换为空 $reg = '/<[a-z][a-z0-9]*\b[^>]*>.*?<\/[a-z][a-z0-9]*>|<[^>]*\/>/is'; return preg_replace($reg, '', $rawStr); } // 整合到你原有的读取逻辑 while (!feof($handle)) { $line = trim(utf8_encode(fgets($handle))); // 新增处理步骤 $processedLine = stripTagsWithContent($line); yield $processedLine; }
测试你给出的示例字符串,可直接得到预期输出Hey my name is . I am a !。
方案2:DOM解析处理(兼容复杂HTML场景)
如果需要处理嵌套标签、标签属性含特殊字符的复杂场景,使用PHP内置DOM扩展处理稳定性更高:
function stripTagsWithContent(string $rawStr): string { // 屏蔽DOM解析过程中的非致命警告 libxml_use_internal_errors(true); $dom = new DOMDocument(); // 增加编码声明避免中文乱码 $dom->loadHTML('<?xml encoding="UTF-8">' . $rawStr); $xpath = new DOMXPath($dom); // 选中所有元素节点批量删除 foreach ($xpath->query('//*') as $node) { $node->parentNode->removeChild($node); } // 提取剩余纯文本内容 return trim($dom->textContent); }
该函数可直接替换方案1中的处理函数,调用逻辑不变。
内容的提问来源于stack exchange,提问作者Tejas S
相关产品推荐
相关产品推荐

