PHP регулярное выражение, убедившись, что пользователь не добавляет слишком много новых разрывов строк - PullRequest
2 голосов
/ 16 января 2012

Форма ввода на моем сайте для комментариев. У меня есть несколько глупых пользователей, которые создают много пустых пробелов, нажимая клавишу ввода [пробел], ввод [пробел] или множество вводов и т. Д. В PHP, как мне сохранить правильное однократное или двойное «ввод», но удалить любые другие комбинации с пробелами между ними. например, это нормально:

\n\n

Это НЕ:

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

Ответы [ 3 ]

2 голосов
/ 16 января 2012
$new_text = preg_replace('/\n\s+\n/','\n',$original_text)`

дескрипторы:

  • более двух \n подряд (примечание \s равно [ \r\t\n], поэтому этот шаблон включает в себя все, что соответствует \n{3,})
  • \n с пробелом между ними, за которым следует еще один \n.\s+ является жадным, поэтому захватит столько промежуточных пробелов и \n, сколько сможет.

Обратите внимание, что это регулярное выражение заменяет любую часть строки, которая содержит как минимум два \n s,за исключением \n\n (который вы хотели сохранить).

РЕДАКТИРОВАТЬ (благодаря @AlanMoore, см. комментарии ниже): он заменяет эти "слишком много \ n" вхождений наодин \n, а не удаляет их полностью, как указано в вашем первоначальном вопросе.Это потому, что если входная строка была foo\n\n\nbar, похоже, что вы бы предпочли foo\nbar, чем foobar в качестве строки результата.

Если вы действительно хотите полностью удалить все эти вхождения, простозаменить на '' выше вместо \n.

1 голос
/ 16 января 2012

Наконец-то все заработало и протестировано.Я решил разбить процесс на два прохода замен, чтобы сохранить код регулярного выражения простым (вы можете объединить оба, если хотите).

Первый (/\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

Я не гуру регулярных выражений, но я думаю, что это уже решает проблему прилично.

1 голос
/ 16 января 2012
$fixed = preg_replace('/\n\s+/', '\n', $bad);

Найдите любой разрыв строки, за которым следуют 1 или более пробельных символов (пробелы, табуляции и т. Д.), И замените его одним разрывом строки.

...