You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

preg_match_ALL正则正常,preg_replace使用错误及修正方法咨询

问题分析与解决

你的正则表达式问题在于没有捕获标签名并在替换时复用:

  • 原正则@<\w+(\s+[^>]*)>@is会完整匹配<td class="td1">这类带属性的标签开头,直接替换为空的话,会把整个标签开头都删掉,而不是只去掉属性。
  • 虽然preg_match_all能匹配到属性,但替换逻辑没考虑保留标签名。

正确实现代码

要保留标签名、仅移除属性,需要把标签名单独放入捕获组,替换时复用这个捕获组内容:

$pattern = '@<(\w+)\s+[^>]*>@is';
$string = 'DATA<td class="td1">111</td><td class="td2">222</td>DATA';
$result = preg_replace($pattern, '<$1>', $string);
echo $result; // 输出:DATA<td>111</td><td>222</td>DATA

逻辑说明

  1. 正则@<(\w+)\s+[^>]*>@is的结构:
    • (\w+):捕获标签名(如td),作为第一个捕获组
    • \s+[^>]*:匹配标签名后的所有属性内容(包括空格和属性文本)
    • @is修饰符:i忽略大小写,s让匹配规则兼容换行场景(当前案例可选,保留可提升通用性)
  2. 替换字符串<$1>:用捕获到的标签名重新构建无属性的标签开头,比如把<td class="td1">替换为<td>

内容的提问来源于stack exchange,提问作者Yamile

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:40:35