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

208

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

creativz
источник
1
Символы новой строки и табуляции заключены в одинарные кавычки, так что вы хотите, чтобы они были буквальными?
Марк Лалор
Я исправил цитирование кода с помощью \ n и \ t, изменив его на двойные кавычки.
Баттл Буткус

Ответы:

394

Тебе нужно:

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

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

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

codaddict
источник
1
его метод лучше, чем этот: почему вы должны заменить один пробел одним пробелом?
Nickf
16
Он также хочет, чтобы \ n и \ t были заменены пробелом. Теперь его шаблон не соответствует этим, скажем, для $ x = "does \ nthis \ twork"; ОП хочет, чтобы все пробелы были заменены одним пробелом.
codaddict
@codaddict, как мы можем сохранить \ n и удалить все остальные множественные пробелы и табуляции из строки? Пожалуйста, помогите мне
Мансурхан Черупужа
Можете ли вы быть более конкретным, почему рекомендуется \ s +?
Исиус
6
Обратите внимание, что в PHP, \sне включая «вертикальную вкладку» chr(11). Чтобы включить его, вам нужно использовать spaceкласс символов: [[:space:]]+ php.net/manual/en/regexp.reference.character-classes.php
Ярослав
68
<?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
Cez
источник
3
Вы настоящий спасатель. Я собирался выпрыгнуть, если окно над этим.
bikey77
Аккуратные, еще полезно
spekulatius
16
preg_replace('/[\s]+/mu', ' ', $var);

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

анонимное
источник
2
Квадратные скобки здесь не нужны, потому что в них есть только одна вещь. Не /mбудет иметь эффекта, так как нет ^или $якоря, и /uне будет иметь никакого эффекта, кроме как немного замедлить его и умереть, если входная строка недопустима UTF-8 (это не влияет на то \s, что соответствует, но это повлияет на \pZ).
Томасруттер
12

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

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

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

Лукас Лиесис
источник
7
$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);
ghostdog74
источник
2
Это тот, который работал для меня лучше всего. Кроме того, я бы добавил обрезку для удаления пробелов в начале и конце строки
Дзямид
@Dziamid Вы можете сделать это с помощью trim (preg_replace (...))
Balázs Varga
7

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

$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);
nickf
источник
2
+1, правда. Для строки с множеством одиночных пробелов (что обычно имеет место) неэффективно заменять пробел пробелом.
codaddict
1
@coaddict: чтобы проверить вашу гипотезу, я написал быстрый сценарий, который запускает 1000 каждой замены и проверяет время каждой. Для строки '+1, True. Для строки с множеством одиночных пробелов (что обычно имеет место) неэффективно заменять пробел пробелом. - codaddict 24 февраля \ 10 в 13:32 ' , одна тысяча вызовов \ s + preg_replace () заняла 0,010547876358032 секунд, а одна тысяча (?: \ S \ s + | \ n | \ t) вызовов preg_replace () заняла 0,013049125671387, в результате чего это почти на 30% медленнее.
Джозеф Чик
Возможно, вы захотите добавить «\ r» в этот последний пример, поскольку некоторые компьютеры используют один «\ r» самостоятельно (Apple Mac?)
thomasrutter
4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

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

middus
источник
4
<?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);
Дануэль О'Нил
источник
статическая функция remove_whitespace по какой причине? Вы определяете, но никогда не используете это.
Лукас Лиезис
Каждый из них имеет свое применение, но ни один из них не достиг бы того, о чем просит вопрос - заменить несколько последовательных пробелов только одним. Ваш «remove_doublewhitespace» заменит только несколько одинаковых символов пробела, поэтому он заменит «\ n \ n \ n» на «», но ничего не будет делать с «\ r \ n»
thomasrutter
4

Без 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;
hharek
источник
2

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

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;

Вы можете проверить это на http://writecodeonline.com/php/

Каталин Т.
источник
Это работает со мной даже в mariaDB в этом запросе: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 Так что большое спасибо
jalmatari
1

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

echo preg_replace('/\s{2,}/', ' ', "This is   a Text \n and so on \t     Text text."); // This is a Text and so on Text text.
Алекс Поло
источник
1

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

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

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

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

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

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

matsolof
источник
1

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

preg_replace('/\n+|\t+|\s+/',' ',$string);
BigBlast
источник
1

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

preg_replace("/\s{2,}/", "\t", $string);
Хеман Г
источник
-2

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

<?php

$str = "This is   a Text \n and so on \t     Text text.";
$str_length = strlen($str);
$str_arr = str_split($str);
for ($i = 0; $i < $str_length; $i++) {
    if (isset($str_arr[$i + 1])
       && $str_arr[$i] == ' '
       && $str_arr[$i] == $str_arr[$i + 1]) {
       unset($str_arr[$i]);
    } 
    else {
      continue;
    }
}

 echo implode("", $str_arr) ; 

 ?>
Шахбаз Хан
источник