Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

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

#php #регулярные_выражения #pcre


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

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


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


Ответы

Ответ 1



Вариант 1. Напишите символы явно - пробел и табуляцию $str=preg_replace("/[ \t]{2,}/"," ",$str); Вариант 2. Строку разделить на кусочки (split/exlode) по переводу строки. Каждую строку обработать и потом сделать join. Выглядит немного странно, но зато поможет решить проблему вида "у меня есть пробелы в начале и конце строки, как и их удалить?".

Ответ 2



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

Ответ 3



Ещё один способ: https://ideone.com/rI37yg $str = preg_replace("/((?!\\n)\\s)+/", " ", $str);

Ответ 4



В регулярных вырадениях PHP горизонтальные пробельные символы можно найти с помощью \h: $str = preg_replace("/\h{2,}/u", " ", $str); См. демо регулярного выражения. PHP-демо: $re = '/\h{2,}/u'; $str = "Мы нашли\nпробел, табулцию,   ещё один пробел\nконец."; echo preg_replace($re, ' ', $str); Результат: Мы нашли пробел, табулцию, ещё один пробел конец.

Ответ 5



Добавлю в коллекцию ответов свой вариант: $str = "Text test \n ert Text test \n "; echo preg_replace('~\p{Z}{2,}~', ' ', $str);

Комментариев нет:

Отправить комментарий