Php заменить несколько пробелов одним

Удаление нескольких пробелов

Я получаю $row[‘message’] из базы данных MySQL, и мне нужно удалить все пробелы, такие как \n \t и т. Д.

$row['message'] = "This is a Text \n and so on \t Text text."; 

следует отформатировать в:

$row['message'] = 'This is a Text and so on Text text.'; 
 $ro = preg_replace('/\s\s+/', ' ',$row['message']); echo $ro; 

но он не удаляет \n или \t , а только отдельные пробелы. Может ли кто-нибудь сказать мне, как это сделать?

$ro = preg_replace('/\s+/', ' ',$row['message']); 

Вы используете \s\s+ что означает пробел (пробел, табуляция или новая строка), за которым следует одно или несколько пробелов. Это эффективно означает замену двух или более пробелов одним пространством.

Вы хотите заменить одно или несколько пробелов одиночными пробелами, так что вы можете использовать шаблон \s\s* или \s+ (рекомендуется)

/', '/[\t\n]/'), ' ', $str); echo $str; echo "\n---\n"; echo "$stripped"; ?> 
This is a string with spaces, tabs and newlines present --- This is a string with spaces, tabs and newlines present 

Я не могу воспроизвести проблему здесь:

$x = "this \n \t\t \n works."; var_dump(preg_replace('/\s\s+/', ' ', $x)); // string(11) "this works." 

Я не уверен, что это была просто ошибка транскрипции или нет, но в вашем примере вы используете строку с одним кавычком. \n и \t рассматриваются только как новая строка и табуляция, если у вас есть двойная кавычка. То есть:

Изменить : как указывал Codaddict, \s\s+ не заменяет один символ табуляции. Я все еще не думаю, что использование \s+ – эффективное решение, хотя, как бы об этом:

Читайте также:  Python list files from folder

\s уже содержит вкладки и новые строки, поэтому этого выше регулярного выражения оказывается достаточно.

упрощенная до одной функции:

function removeWhiteSpace($text) < $text = preg_replace('/[\t\n\r\0\x0B]/', '', $text); $text = preg_replace('/([\s])\1+/', ' ', $text); $text = trim($text); return $text; > 

основанный на ответе Дануэла О’Нила.

$str='This is a Text \n and so on Text text.'; print preg_replace("/[[:blank:]]+/"," ",$str); 
$str = "This is a Text \n and so on \t Text text."; $str = str_replace(["\r", "\n", "\t"], " ", $str); while (strpos($str, " ") !== false) < $str = str_replace(" ", " ", $str); >echo $str; 
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']); 

Это заменяет все вкладки, все строки новой строки и все комбинации нескольких пространств, вкладок и строк новой строки с одним пробелом.

 static function remove_whitespace($s = null) < return $ret = preg_replace('/[\s]+/', '', $s ); >static function remove_whitespace_feed( $s = null) < return $ret = preg_replace('/[\t\n\r\0\x0B]/', '', $s); >static function smart_clean($s = null) < return $ret = trim( self::remove_doublewhitespace( self::remove_whitespace_feed($s) ) ); >> $string = " Hey yo, what's \t\n\tthe sc\r\nen\n\tario! \n"; echo whitespace::smart_clean($string); 

Это то, что я буду использовать:

а. Обязательно используйте двойные кавычки, например:

$row['message'] = "This is a Text \n and so on \t Text text."; 

б. Чтобы удалить лишние пробелы, используйте:

$ro = preg_replace('/\s+/', ' ', $row['message']); echo $ro; 

Это может быть не самое быстрое решение, но я думаю, что это потребует наименьшего кода, и оно должно работать. Однако я никогда не использовал mysql, поэтому я могу ошибаться.

Я использую этот код и шаблон:

preg_replace('/\\s+/', ' ',$data) $data = 'This is a Text and so on Text text on multiple lines and with whitespaces'; $data= preg_replace('/\\s+/', ' ',$data); echo $data; 

Все, что вам нужно, это запустить его следующим образом:

echo preg_replace('/\s/', ' ', "This is a Text \n and so on \t Text text."); // This is a Text and so on Text text. 

По правде говоря, если вы думаете, что хотите что-то вроде этого:

это заменит несколько вкладок одной вкладкой

Без preg_replace, с помощью цикла.

 else < continue; >> echo implode("", $str_arr) ; ?> с  else < continue; >> echo implode("", $str_arr) ; ?> 

Источник

Как правильно заменить несколько пробелов с одним пробелом в PHP?

Я искал ответы SO и обнаружил, что решение, которое больше всего дало для замены нескольких пробелов:

$new_str = preg_replace("/\s+/", " ", $str); 

Но во многих случаях символы пробела включают символы UTF, которые включают перевод строки, перевод формы, возврат каретки, неразрывный пробел и т. Д. Это вики описывает, что UTF определяет двадцать пять символов, определенных как пробел.

Так как же заменить все эти символы с помощью регулярных выражений?

Решение

При прохождении u модификатор, \s становится Unicode-осведомленным. Итак, простое решение заключается в использовании

$new_str = preg_replace("/\s+/u", " ", $str); ^^ 

Другие решения

Первое, что нужно сделать, это прочитать этот объяснение того, как можно обрабатывать юникод в регулярных выражениях. Если говорить конкретно о PHP, нам нужно прежде всего включить модификатор PCRE ‘u’, чтобы механизм распознавал символы UTF. Так что это будет:

Далее следует отметить, что в PHP символы Юникода имеют шаблон \x где 00A0 это шестнадцатеричное представление для non-breaking space , Поэтому, если мы хотим заменить последовательные неразрывные пробелы одним пробелом, у нас будет:

$pattern = "/\x+/u"; $new_str = preg_replace($pattern," ",$str); 

И если бы мы включили другие типы пространств, упомянутых в вики, как:

Но это на самом деле не так уж и здорово, так как движку регулярных выражений понадобится целая вечность, чтобы выяснить все комбинации этих символов. Это связано с тем, что символы заключены в квадратные скобки [], и у нас есть + для одного или нескольких вхождений.

Лучший способ получить более быстрые результаты — сначала заменить все вхождения каждого из этих символов обычным пробелом. А затем заменить несколько пробелов на один нормальный пробел. Мы удаляем [] + и вместо этого разделяем символы с помощью оператора или | :

$pattern = "/\x|\x|\x|\x/u"; $new_str = preg_replace($pattern," ",$str); // we have one-to-one replacement of character by a normal space, so 5 unicode chars give 5 normal spaces $final_str = preg_replace("/\s+/", " ", $new_str); // multiple normal spaces now become single normal space 

Если вы анализируете пользовательский ввод в UTF-8 и нуждаетесь в его нормализации, важно основать ваше совпадение на этом списке. Итак, чтобы ответить на ваш вопрос, это будет:

$new_str = preg_replace(«/[\pZ\pC]+/u», » «, $str);

Источник

Удаление лишних пробелов в PHP.

Обрабатывая информацию, собирая ее из разных источников, например с сайта поставщика, мы часто сталкиваемся с тем, что нам надо ее привести в достойный вид, удалив лишние пробелы.

Удаление пробелов в начале или конце строки.

Стандартные функция trim( string $str [, string $character_mask = » \t\n\r\0\x0B» ]) удаляет все возможные пробелы в начале или в конце строки, так же эта функция может удалять те символы, которые вам не нужны, например точку или запятую:

Так же есть 2 функции, ltrim и rtrim, которые работают так же как и trim, за исключением того , что ltrim удаляет символы в начале строки, а rtrim в конце.

Удаление лишних пробелов в самом тексте.

Иногда нужно удалить лишние пробелы, а иногда и табы, в самом тексте, например: «Купив телефон сегодня вы получите самый лучший подарок». В этом тексте после каждого слова стоит более 1 пробела, Попробуем заменить лишние через регулярное выражение:

В данном случае \s говорит что надо заменить все пробелы, а + включая табы на 1 пробел. Если вы считаете, что регулярные выражения зло, то можно использовать:

$str = str_replace(» «, » «, $str); while( strpos($str,» «)!==false)

Удаление «не удаляемых» пробелов.

Возможно вы столкнулись с такой проблемой, что ни одно из средств перечисленных выше не удаляет пробелы. Для начала рассмотрите внимательно текст, желательно в исходном коде, потому что текст « Купив телефон сегодня вы получите самый лучший подарок» может оказаться таким: «&nbsp;Купив  телефон сегодня вы получите самый лучший подарок». Для начала надо заменить &nbsp; и   просто на пробелы:

$str = str_replace('&', '&', $str); $str = str_replace(' ', ' ', $str);

А потом, применить один из способов, о котором я писал выше.

Хорошо, это мы сделали, но у нас остались лишние пробелы, которые не удаляются стандартными методами. Вероятнее всего это NO-BREAK SPACE, в таблице utf-8 символов он идет как c2 a0.

Для начала попробуйте перевести ваш текст в HEX:

echo bin2hex($str); echo substr_count($str, "\xc2\xa0");

и поищите там: c2a0, как видно на скриншоте, у меня аж 2 таких пробела

Удаление через регулярное выражение:

echo preg_replace('!\s++!u', ' ', $str);

Удаление без регулярного выражения:

$text = hex2bin(str_replace('c2a0', '20', bin2hex($str))); while( strpos($text,' ')!==false) < $text = str_replace(" ", " ", $text); >$text = trim($text);

переводим наш текс в HEX, заменяем NO-BREAK SPACE на обычный пробел, переводим обратно в обычный текст, после этого можно сделать замену пробелов и чистку.

Возможно у вас есть свой способ, может более практичный, как исправлять «не удаляемые» пробелы, то поделитесь в комментариях.

Источник

Оцените статью