Регулярка, только пробелы \s, исключая \n

305
11 октября 2017, 09:17

Пытаюсь заменить в строке пробелы повторяющиеся два и более раза на одинарные, вот так:

$str=preg_replace("/\s{2,}/"," ",$str);

Но параметр \s заменяет не только пробелы, но и символы перевода строки \n причем на пробел, а мне нужно только пробелы и табуляции. Как сделать?

Answer 1

Вариант 1. Напишите символы явно - пробел и табуляцию

$str=preg_replace("/[ \t]{2,}/"," ",$str);

Вариант 2. Строку разделить на кусочки (split/exlode) по переводу строки. Каждую строку обработать и потом сделать join. Выглядит немного странно, но зато поможет решить проблему вида "у меня есть пробелы в начале и конце строки, как и их удалить?".

Answer 2

Как насчет того, чтобы указать в регулярке пробел: $str=preg_replace("/ {2,}/"," ",$str);?

Answer 3

Ещё один способ: https://ideone.com/rI37yg

$str = preg_replace("/((?!\\n)\\s)+/", " ", $str);
Answer 4

В регулярных вырадениях PHP горизонтальные пробельные символы можно найти с помощью \h:

$str = preg_replace("/\h{2,}/u", " ", $str);

См. демо регулярного выражения.

PHP-демо:

$re = '/\h{2,}/u';
$str = "Мы  нашли\nпробел,          табулцию,   ещё    один пробел\nконец.";
echo preg_replace($re, ' ', $str);

Результат:

Мы нашли
пробел, табулцию, ещё один пробел
конец.
Answer 5

Добавлю в коллекцию ответов свой вариант:

$str = "Text test    \n  ert Text test  \n  ";
echo preg_replace('~\p{Z}{2,}~', ' ', $str);
READ ALSO
PHP connection fail [требует правки]

PHP connection fail [требует правки]

Парни, пытаюсь подключить serverphp к index

188
Добавляет пустые строки в бд

Добавляет пустые строки в бд

Хочу добавить в бд запись пишу в адресную строку http://project-546564codeanyapp

237
Запрос по столбцам, как сделать?

Запрос по столбцам, как сделать?

У меня есть 51 столбец, как можно оптимизировать этот код,чтобы не вбивать все столбцы? -- Получение 50 то что до | SELECT SUBSTRING_INDEX('50|100', '|', 1);

343
array_push в json_массив PHP

array_push в json_массив PHP

Как в массив такого вида

214