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
逻辑说明
- 正则
@<(\w+)\s+[^>]*>@is的结构:(\w+):捕获标签名(如td),作为第一个捕获组\s+[^>]*:匹配标签名后的所有属性内容(包括空格和属性文本)@is修饰符:i忽略大小写,s让匹配规则兼容换行场景(当前案例可选,保留可提升通用性)
- 替换字符串
<$1>:用捕获到的标签名重新构建无属性的标签开头,比如把<td class="td1">替换为<td>
内容的提问来源于stack exchange,提问作者Yamile
相关产品推荐
相关产品推荐

