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

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

Ответ 1

Вам нужно:

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

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

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

Ответ 2

<?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

Ответ 3

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

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

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

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

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

preg_replace('/(?:\s\s+|\n|\t)/', ' ', $x);

Ответ 4

preg_replace('/[\s]+/mu', ' ', $var);

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

Ответ 5

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

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

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

Ответ 6

$str='This is   a Text \n and so on Text text.';
print preg_replace("/[[:blank:]]+/"," ",$str);

Ответ 7

Без 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;

Ответ 8

preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);

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

Ответ 9

<?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 \t\n\tthe sc\r\nen\n\tario! \n";
echo whitespace::smart_clean($string);

Ответ 10

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

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

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

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

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

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

Ответ 11

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

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/

Ответ 12

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

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.

Ответ 13

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

preg_replace('/\n+|\t+|\s+/',' ',$string);

Ответ 14

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

preg_replace("/\s{2,}/", "\t", $string);

Ответ 15

Без 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) ; 

 ?>