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