Удалить несколько пробелов - PullRequest
190 голосов
/ 24 февраля 2010

Я получаю $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, только одиночные пробелы. Может кто-нибудь сказать мне, как это сделать?

Ответы [ 15 ]

361 голосов
/ 24 февраля 2010

Вам нужно:

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

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

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

62 голосов
/ 24 февраля 2010
<?php
$str = "This is  a string       with
spaces, tabs and newlines present";

$stripped = preg_replace(array('/\s{2,}/', '/[\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
11 голосов
/ 19 августа 2012
preg_replace('/[\s]+/mu', ' ', $var);

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

10 голосов
/ 29 мая 2015

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

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

на основе ответа Дануэля О'Нила.

7 голосов
/ 24 февраля 2010

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

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

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

'\n\t' != "\n\t"

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

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);
7 голосов
/ 24 февраля 2010
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
4 голосов
/ 12 мая 2015

без preg_replace ()

$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;
4 голосов
/ 27 июня 2010
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

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

3 голосов
/ 05 июня 2012
<?php
#This should help some newbies
# REGEX NOTES FROM DANUEL
# I wrote these functions for my own php framework
# Feel Free to make it better
# If it gets more complicated than this. You need to do more software engineering/logic.
# (.)  // capture any character
# \1   // if it is followed by itself
# +    // one or more

class whitespace{

    static function remove_doublewhitespace($s = null){
           return  $ret = preg_replace('/([\s])\1+/', ' ', $s);
    }

    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);
1 голос
/ 19 сентября 2010

Вот что я бы использовал:

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

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

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

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

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

...