使用PHP修改删除HTML中手机号:替代XPath结合正则的方案
PHP处理HTML中手机号的最优方案
采用DOMDocument解析HTML + XPath提取文本节点 + 正则匹配处理的组合方案即可,完美解决XPath不支持直接调用正则的问题,实现逻辑和代码如下:
- 先通过
DOMDocument加载目标HTML内容,用@抑制非标准HTML的解析警告,避免因页面标签不规范导致解析中断,同时加入UTF-8声明避免中文乱码 - 用XPath的
//text()表达式提取所有元素内的文本节点,无需提前指定标签类型,p、span、li等任意标签内的文本都能匹配到 - 遍历所有文本节点,对每个节点的内容用自定义正则匹配手机号,匹配后直接修改节点值即可实现替换、删除等操作
手机号匹配正则
针对你给出的4种手机号格式,可用以下正则覆盖,可根据实际业务的手机号规则调整匹配位数和格式:
(\(?\d{3}\)?[\s-]?\d?\s?\d{3}[\s-]?\d{4}|\d{10,11}|\d{5}\s\d{4})
可匹配的格式包括:
(xxx) xxxx xxxxxxxxxxxxxx/xxxxxxxxxxx(10/11位纯数字手机号)(xxx) x xxx xxxxxxxxx xxxx
代码示例
// 你的待处理HTML内容 $sourceHtml = <<<HTML <p style="text-align: center;">(123) 4567 8901</p> <span style="text-align: center;">13812345678</span> <li style="text-align: center;">(135) 1 234 5678</li> <p style="text-align: left;">12345 6789</p> HTML; // 初始化DOM解析器 $dom = new DOMDocument(); // 加载HTML,抑制不规范标签警告,指定编码避免乱码 @$dom->loadHTML('<?xml encoding="UTF-8">' . $sourceHtml); $xpath = new DOMXPath($dom); // 查询所有文本节点 $allTextNodes = $xpath->query('//text()'); // 手机号匹配规则 $phoneReg = '/(\(?\d{3}\)?[\s-]?\d?\s?\d{3}[\s-]?\d{4}|\d{10,11}|\d{5}\s\d{4})/'; // 遍历处理 foreach ($allTextNodes as $textNode) { $rawText = $textNode->nodeValue; // 要删除手机号就把替换值改成空字符串'',要脱敏就改成'***'或者自定义规则 $newText = preg_replace($phoneReg, '***', $rawText); $textNode->nodeValue = $newText; } // 导出处理后的HTML $processedHtml = $dom->saveHTML(); // 输出/保存处理结果即可 echo $processedHtml;
方案优势
- 完全保留原有HTML的标签、样式、属性,不会出现直接对整个HTML字符串做正则替换导致的误改标签内容、破坏页面结构的问题
- 适配性高,不管手机号在什么标签里都能匹配到,正则可以随时调整覆盖更多手机号格式
- 性能足够应对常规批量HTML处理需求,只要不是单文件超过100M的超大HTML都能稳定运行
内容的提问来源于stack exchange,提问作者Dg2A
相关产品推荐
相关产品推荐

