Заменить лишние пробелы и разрывы строк на PHP?
$string = "My text has so much whitespace
Plenty of spaces and tabs";
echo preg_replace("/\s\s+/", " ", $string);
Я прочитал документацию по PHP и следую инструкциям preg_replace, однако этот код создает
В моем тексте есть много пробелов. Много пробелов и вкладок
Как я могу включить его:
В моем тексте есть много пробелов
Множество пробелов и вкладок
Ответы
Ответ 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);
Ответ 3
Заменить множественную новую строку, вкладку, пробел
$text = preg_replace("/[\r\n]+/", "\n", $text);
$text = preg_replace("/\s+/", ' ', $text);
Протестировано:)
Ответ 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, вы должны использовать
Ответ 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);