phpregex,确保用户不会添加太多换行符


php regex, making sure user doesnt add too many new line breaks

在我的网站上输入表格以获得评论。我有一些愚蠢的用户通过按enter[space]enter[space]或大量输入等方式创建了大量空白在PHP中,我如何保留合法的单输入或双输入,但删除中间有空格的任何其他组合。这没问题:

'n'n

这不是:

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

手柄:

  • 一行中有两个以上的'n(注意's[ 'r't'n],因此此模式包括与'n{3,}匹配的任何内容)
  • CCD_ 5之间有空白,后面跟着另一个CCD_。's+是贪婪的,因此将尽可能多地获取中间空间和'n

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

EDIT(感谢@AlanMoore,请参阅下面的评论):它用一个'n替换了这些"太多"的事件,而不是像您指定的原始问题那样完全删除它们。这是因为如果输入字符串是foo'n'n'nbar,那么结果字符串似乎更喜欢foo'nbar而不是foobar

如果您确实想完全删除所有这些事件,只需将其替换为上面的'',而不是'n

终于让它工作起来并进行了测试。我决定通过两次替换来打破这个过程,以保持regex代码的简单性(如果需要,可以将两者结合起来)。

第一个(/'n | {1,} | 'n/)将查找空间和'n字符的任意随机组合,留下单独的'n

第二个('/(?<='n{2})'n*/')利用后向查找功能来匹配任何'''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

我不是正则表达式专家,但我认为它已经很好地解决了这个问题。

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

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