Подтвердить что ты не робот

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

$string = "My    text       has so    much   whitespace    




Plenty of    spaces  and            tabs";

echo preg_replace("/\s\s+/", " ", $string);

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

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

Как я могу включить его:

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

4b9b3361

Ответ 1

Во-первых, я хотел бы указать, что новые строки могут быть либо \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 (пробел, табуляция, новая строка, разрыв строки), которые являются концом строки и началом из следующего. Это решает проблему пустых строк, которые не имеют ничего, кроме пробелов. В моем предыдущем примере, если строка была заполнена пробелами, она пропустила бы лишнюю строку.

Ответ 2

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

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

Ответ 4

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

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

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

Ответ 5

//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.

Ответ 6

попробуйте:

$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); 

Ответ 7

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

Например:

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

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

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

Ответ 8

это означало бы ПОЛНОСТЬЮ 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);