php regex,确保用户不会添加太多新的换行符

时间:2012-01-16 02:16:59

标签: php regex line-breaks

在我的网站上输入表格以征求意见。我有一些愚蠢的用户通过按[空格]输入[空格]或大量进入等创建大量空白空白 在PHP中,如何保留单一输入或双重'输入',但删除中间有空格的任何其他组合。 例如,这没关系:

\n\n

这不是:

\n\n\n...
\n\n \n...
\n \n \n...

3 个答案:

答案 0 :(得分:2)

$new_text = preg_replace('/\n\s+\n/','\n',$original_text)`

处理:

  • 连续两个\n(注意\s[ \r\t\n],因此此模式包含与\n{3,}匹配的所有内容。
  • \n中间有空格,后跟另一个\n\s+是贪婪的,所以会抓住尽可能多的中间空格和\n

请注意,此正则表达式替换了包含至少两个\n的字符串的任何部分,但\n\n除外(您希望将其保留)。

编辑(感谢@AlanMoore,请参阅下面的评论):它用一个\n替换这些“太多\ n”出现,而不是完全删除它们,因为您指定了原始问题。这是因为如果输入字符串是foo\n\n\nbar,那么您似乎宁愿foo\nbar而不是foobar作为结果字符串。

如果您确实想要完全删除所有这些内容,请使用上面的''代替\n

答案 1 :(得分:1)

$fixed = preg_replace('/\n\s+/', '\n', $bad);

查找任何换行后跟一个或多个空格字符(空格,制表符等),并将其替换为单个换行符。

答案 2 :(得分:1)

最后让它工作和测试。我决定在两次替换过程中打破这个过程以保持正则表达式代码简单(如果你愿意的话,你可以将两者结合起来。)

第一个(/\n | {1,} | \n/)将查找空格和\n个字符的任意随机组合,并保留独奏\n

第二个('/(?<=\n{2})\n*/')使用look back功能来匹配任何'\ n \ n'后面的任何\n个字符组(双新行序列)。

测试:

$string ="
Loren Ipsum Dolor Sit Amet\n
Loren Ipsum Dolor Sit Amet\n
\n
Loren Ipsum Dolor Sit Amet\n
\n
\n
Loren Ipsum Dolor Sit Amet\n
\n
\n
\n
.\n
\n
..\n
.....\n
.\n
...\n
Loren Ipsum Dolor Sit Amet";

$string = preg_replace('/\n | {1,} | \n/', '', $string);
$string = preg_replace('/(?<=\n{2})\n*/', '', $string);
echo $string;

输出:

Loren Ipsum Dolor Sit Amet\n
Loren Ipsum Dolor Sit Amet\n
\n
Loren Ipsum Dolor Sit Amet\n
\n
Loren Ipsum Dolor Sit Amet\n
\n
Loren Ipsum Dolor Sit Amet

我不是一个正则表达的大师,但我认为它已经很好地解决了这个问题。