PHP中rtrim去除末尾<br>异常截断字符的问题及需求
解决PHP中rtrim移除
<br>时意外截断字符的问题 哈哈,这个坑我刚入行的时候也踩过!先给你把问题根源说清楚,再给几个靠谱的解决方案。
为啥rtrim会把最后一个>也删掉?
你可能误解了rtrim()第二个参数的作用——它不是用来匹配完整子串的,而是一个字符集合(掩码)。也就是说,rtrim($string, "<br>")的意思是:从字符串末尾开始,逐个移除所有属于<、b、r、>这几个字符的内容,直到碰到不在这个集合里的字符为止。
看你的测试代码,原字符串是"<a href='#'>Test</a><br>",当rtrim处理时:
- 先去掉末尾的
<br>没问题; - 接着检查剩下的字符串末尾是
</a>的最后一个>,这个字符正好在掩码里,所以也被删掉了; - 直到碰到
a,这个字符不在掩码里,才停止处理。
最终就得到了少个>的结果。
正确实现:只移除末尾的单个<br>
要实现“仅当字符串末尾存在<br>时,移除这最后一个<br>”,有两种最常用的方法:
方法1:正则表达式(推荐,兼容性强)
用preg_replace精准匹配字符串末尾的<br>,只替换一次:
$string = preg_replace('/<br>$/', '', $string);
如果需要兼容HTML里常见的<br />或者<br/>格式,甚至末尾带空白的情况,可以把正则调整得更灵活:
// 匹配末尾的<br>、<br/>、<br />,忽略末尾可能的空白字符 $string = preg_replace('/<br\s*\/?>$/', '', $string);
方法2:字符串截取检查(直观易懂)
先判断字符串末尾是不是正好是<br>,如果是就截取掉对应的长度:
$target = '<br>'; $targetLength = strlen($target); if (substr($string, -$targetLength) === $target) { $string = substr($string, 0, -$targetLength); }
这个方法逻辑直白,适合不需要兼容多种<br>格式的简单场景。
测试你的案例
用你的示例代码验证一下:
// 案例1:末尾没有<br>,保持原样 $string = "<a>CC</a><br><a>CC</a>"; echo preg_replace('/<br>$/', '', $string); // 输出:<a>CC</a><br><a>CC</a> // 案例2:末尾有<br>,移除 $string = "<a>CC</a><br><a>CC</a><br>"; echo preg_replace('/<br>$/', '', $string); // 输出:<a>CC</a><br><a>CC</a>
完全符合你的预期需求。
内容的提问来源于stack exchange,提问作者Giuseppe Lodi Rizzini
相关产品推荐
相关产品推荐

