求助:PHP实现多行换行压缩与空白环绕换行移除
解决方案
咱们先把问题拆清楚,你的核心需求是两个:一是干掉用户用「空格/制表符+换行+空格/制表符」玩的规避手段,二是把4个及以上的连续换行压缩成3个(也就是最多留2个空行)。你的原始代码之所以失效,是因为正则用错了范围,把连续换行也一并抹平了。
试试这段修正后的代码:
// 1. 移除被空格、制表符环绕的换行,替换为单个空格(破解用户的规避操作) $text = preg_replace('/[ \t]*\R[ \t]*/', ' ', $text); // 2. 将4个及以上连续换行压缩为3个(限制空行最多2个) $text = preg_replace('/\R{4,}/', "\n\n\n", $text);
为什么你的原始代码没效果?
你第一个正则用了\s*\R\s*,但\s在正则里是包含换行符的!这就导致连续的多个换行(比如\n\n\n)会被整个匹配成一个单元,直接替换成单个\n——等于把所有连续换行都抹平成了单个,第二个正则\R{3,}自然找不到任何匹配项,最终结果就只剩孤零零的单个换行符了。
效果验证
举个实际输入的例子:
这是第一行 这是第二行 \t\n 我本来是和上一行连在一起的 这是第四行 这是第五行
处理后会变成:
这是第一行 这是第二行 我本来是和上一行连在一起的 这是第四行 这是第五行
- 被空格、制表符包裹的换行被合并成了一行,用单个空格分隔
- 原本的6个连续换行被压缩成3个(对应2个空行)
- 正常的单个换行、2个连续换行(1个空行)都完整保留了
内容的提问来源于stack exchange,提问作者PHPMYSQLDEV
相关产品推荐
相关产品推荐

