Заменить лишние пробелы и разрывы строк на PHP?

$string = "My text has so much whitespace Plenty of spaces and tabs"; echo preg_replace("/\s\s+/", " ", $string); 

Я прочитал документацию PHP и следую инструкциям preg_replace, однако этот код создает

В моем тексте есть много пробелов. Много пробелов и вкладок.

Как я могу превратить его в:

В моем тексте так много пробелов
Много мест и вкладок

Solutions Collecting From Web of "Заменить лишние пробелы и разрывы строк на PHP?"

Во-первых, я хотел бы отметить, что новые строки могут быть либо \ r, \ n, либо \ r \ n в зависимости от операционной системы.

Мое решение:

 echo preg_replace('/[ \t]+/', ' ', preg_replace('/[\r\n]+/', "\n", $string)); 

При необходимости можно разделить на две строки:

 $string = preg_replace('/[\r\n]+/', "\n", $string); echo preg_replace('/[ \t]+/', ' ', $string); 

Обновление :

Еще лучшими решениями были бы такие:

 echo preg_replace('/[ \t]+/', ' ', preg_replace('/\s*$^\s*/m', "\n", $string)); 

Или:

 $string = preg_replace('/\s*$^\s*/m', "\n", $string); echo preg_replace('/[ \t]+/', ' ', $string); 

Я изменил регулярное выражение, которое делает несколько строк разбитыми на один лучше. Он использует модификатор «m» (который делает ^ и $ соответствует началу и концу новых строк) и удаляет любые символы \ s (пробел, табуляция, новая строка, разрыв строки), которые являются концом строки и началом из следующего. Это решает проблему пустых строк, которые не имеют ничего, кроме пробелов. В моем предыдущем примере, если строка была заполнена пробелами, она пропустила бы лишнюю строку.

Отредактировал правильный ответ. Из PHP 5.2.4 или около того следующий код будет делать:

 echo preg_replace('/\v(?:[\v\h]+)/', '', $string); 

Заменить множественную новую строку, вкладку, пробел

 $text = preg_replace("/[\r\n]+/", "\n", $text); $text = preg_replace("/\s+/", ' ', $text); 

Протестировано 🙂

Альтернативный подход:

 echo preg_replace_callback("/\s+/", function ($match) { $result = array(); $prev = null; foreach (str_split($match[0], 1) as $char) { if ($prev === null || $char != $prev) { $result[] = $char; } $prev = $char; } return implode('', $result); }, $string); 

Выход :

 My text has so much whitespace Plenty of spaces and tabs 

Edit : Readded this, потому что это другой подход. Вероятно, это не то, о чем просили, но, по крайней мере, он не будет объединять группы с разными space, tab, tab, space, nl, nl, space, space (например, space, tab, tab, space, nl, nl, space, space станут space, tab, space, nl, space ).

 //Newline and tab space to single space $from_mysql = str_replace(array("\r\n", "\r", "\n", "\t"), ' ', $from_mysql); // Multiple spaces to single space ( using regular expression) $from_mysql = ereg_replace(" {2,}", ' ',$from_mysql); // Replaces 2 or more spaces with a single space, {2,} indicates that you are looking for 2 or more than 2 spaces in a string. 

почему вы так делаете?
html отображает только одно пространство, даже если вы используете более одного места …

Например:

 <i>test content 1 2 3 4 5</i> 

Выход будет:
тестовое содержание 1 2 3 4 5

если вам нужно больше одного места в html, вам нужно использовать &nbsp;

попробуйте:

 $string = "My text has so much whitespace Plenty of spaces and tabs"; //Remove duplicate newlines $string = preg_replace("/[\n]*/", "\n", $string); //Preserves newlines while replacing the other whitspaces with single space echo preg_replace("/[ \t]*/", " ", $string); 

это ПОЛНОСТЬЮ MINIFY всей строки (например, большая статья блога), но сохраняя все теги HTML на месте.

 $email_body = str_replace(PHP_EOL, ' ', $email_body); //PHP_EOL = PHP_End_Of_Line - would remove new lines too $email_body = preg_replace('/[\r\n]+/', "\n", $email_body); $email_body = preg_replace('/[ \t]+/', ' ', $email_body);