Заменить лишние пробелы и переносы строк с помощью PHP? - PullRequest
33 голосов
/ 18 июня 2011
$string = "My    text       has so    much   whitespace    




Plenty of    spaces  and            tabs";

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

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

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

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

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

Ответы [ 9 ]

46 голосов
/ 18 июня 2011

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

Мое решение:

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

Которые можно разделить на 2 строки, если необходимо:

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

9 голосов
/ 30 января 2016

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

echo preg_replace('/\v(?:[\v\h]+)/', '', $string);
4 голосов
/ 03 июня 2013
//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.
4 голосов
/ 18 июня 2011

Заменить несколько символов новой строки, табуляции, пробела

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

Проверено:)

2 голосов
/ 20 апреля 2013

это будет ПОЛНОСТЬЮ МИНИФИКАЦИЯ всей строки (например, большая статья в блоге) с сохранением всех 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);
2 голосов
/ 18 июня 2011

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

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

1 голос
/ 18 июня 2011

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

Например:

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

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

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

1 голос
/ 18 июня 2011

попробуйте с:

$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); 
0 голосов
/ 14 марта 2019

Не уверен, что это будет полезно, и я не уверен, что он работает так, как должен, но, похоже, работает для меня.

Функция, которая очищает несколько пробелов и все остальное, что вы хотите или не хотите, и создает либо однострочную, либо многострочную строку (в зависимости от переданных аргументов / опций).Также можно удалять или сохранять символы для других языков и преобразовывать символы новой строки в пробелы.

/** ¯\_(ツ)_/¯ Hope it's useful to someone. **/
// If $multiLine is null this removes spaces too. <options>'[:emoji:]' with $l = true allows only known emoji.
// <options>'[:print:]' with $l = true allows all utf8 printable chars (including emoji).
// **** TODO: If a unicode emoji or language char is used in $options while $l = false; we get an odd � symbol replacement for any non-matching char. $options char seems to get through, regardless of $l = false ? (bug (?)interesting)
function alphaNumericMagic($value, $options = '', $l = false, $multiLine = false, $tabSpaces = "    ") {
    $utf8Emojis = '';
    $patterns = [];
    $replacements = [];
    if ($l && preg_match("~(\[\:emoji\:\])~", $options)) {
        $utf8Emojis = [
            '\x{1F600}-\x{1F64F}', /* Emoticons */
            '\x{1F9D0}-\x{1F9E6}',
            '\x{1F300}-\x{1F5FF}', /* Misc Characters */ // \x{1F9D0}-\x{1F9E6}
            '\x{1F680}-\x{1F6FF}', /* Transport and Map */
            '\x{1F1E0}-\x{1F1FF}' /* Flags (iOS) */
        ];
        $utf8Emojis = implode('', $utf8Emojis);
    }
    $options = str_replace("[:emoji:]", $utf8Emojis, $options);
    if (!preg_match("~(\[\:graph\:\]|\[\:print\:\]|\[\:punct\:\]|\\\-)~", $options)) {
        $value = str_replace("-", ' ', $value);
    }
    if ($l) {
        $l = 'u';
        $options = $options . '\p{L}\p{N}\p{Pd}';
    } else { $l = ''; }
    if (preg_match("~(\[\:print\:\])~", $options)) {
        $patterns[] = "/[ ]+/m";
        $replacements[] = " ";
    }
    if ($multiLine) {
        $patterns[] = "/(?<!^)(?:[^\r\na-z0-9][\t]+)/m";
        $patterns[] = "/[ ]+(?![a-z0-9$options])|[^a-z0-9$options\s]/im$l";
        $patterns[] = "/\t/m";
        $patterns[] = "/(?<!^)$tabSpaces/m";
        $replacements[] = " ";
        $replacements[] = "";
        $replacements[] = $tabSpaces;
        $replacements[] = " ";
    } else if ($multiLine === null) {
        $patterns[] = "/[\r\n\t]+/m";
        $patterns[] = "/[^a-z0-9$options]/im$l";
        $replacements = "";
    } else {
        $patterns[] = "/[\r\n\t]+/m";
        $patterns[] = "/[ ]+(?![a-z0-9$options\t])|[^a-z0-9$options ]/im$l";
        $replacements[] = " ";
        $replacements[] = "";
    }
    echo "\n";
    print_r($patterns);
    echo "\n";
    echo $l;
    echo "\n";
    return preg_replace($patterns, $replacements, $value);
}

Пример использования:

echo header('Content-Type: text/html; charset=utf-8', true);
$string = "fjl!sj\nfl _  sfjs-lkjf\r\n\tskj 婦女與環境健康 fsl \tklkj\thl jhj ⚧? lkj ⸀ skjfl gwo lsjowgtfls s";
echo "<textarea style='width:100%; height:100%;'>";
echo alphaNumericMagic($string, '⚧', true, null);
echo "\n\nAND\n\n";
echo alphaNumericMagic($string, '[:print:]', true, true);
echo "</textarea>";

Результат:

fjlsjflsfjslkjfskj婦女與環境健康fslklkjhljhj⚧lkjskjflgwolsjowgtflss

AND

fjl!sj
fl _ sfjs-lkjf
    skj 婦女與環境健康 fsl klkj hl jhj ⚧? lkj ⸀ skjfl gwo lsjowgtfls s
...