2010-03-03 2 views
138

Я пытаюсь заменить несколько пробелов на одно пространство. Когда я использую ereg_replace, я получаю сообщение об ошибке, поскольку он устарел.php Замена нескольких пробелов одним пробелом

ereg_replace("[ \t\n\r]+", " ", $string); 

Есть ли для него идентичная замена. Мне нужно заменить несколько пробелов " " и несколько пробелов nbsp с одним пробелом.

ответ

297

Использование preg_replace() и вместо [ \t\n\r] использование \s:

$output = preg_replace('!\s+!', ' ', $input); 

От Regular Expression Basic Syntax Reference:

\ д, \ ш и \ S

стенографии классов символов сопоставления цифр, слово символов (буквы, цифры и символы подчеркивания), и белый пробел (пробелы, табы и строка ). Может использоваться внутри и вне классов персонажей.

+0

@Cletus: Этот заменил бы одно пространство пространством. Разве вы не думаете, что что-то вроде: preg_replace ('/ (?: \ S \ s + | \ n | \ t) /', '', $ x) будет более * эффективным * особенно в тексте с несколькими одиночными пробелами? – codaddict

+21

@codaddict: случайно, мгновение назад я сравнивал те по реальным данным, результат (для вызовов ~ 8300 различных текстовых статей): '/ (?: \ S \ s + | \ n | \ t) /' = > 1410 (самый медленный), '/ \ s + /' => 611 (ok'ish), '/ \ s \ s + /' => 496 (самый быстрый). Последний не заменяет одиночные '\ n' или' \ t', но это нормально для моего случая. – Frunsi

+13

/\ s {2,}/u '- если у вас есть проблема с add/u для UTF-8 – user956584

33
preg_replace("/[[:blank:]]+/"," ",$input) 
+3

Не заменяет «\ n» (PHP 5.3), "/ \ s + /" выполнить работу. ;) – Marek

+1

На самом деле это помогло, \ s испортило мое многобайтовое слово, заменив Š на какой-то квадрат. –

+0

@ MārtiņšBriedis Существует отдельная многобайтовая функция: http://php.net/manual/en/function.mb-ereg-replace.php –

29
$output = preg_replace('/\s+/', ' ',$input); 

\ х представляет собой сокращенную [ \t\n\r]. Несколько пробелов будут заменены на одно пространство.

Смежные вопросы