Я получаю $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+
(рекомендуется)
<?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
Я не могу воспроизвести проблему здесь:
$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);
preg_replace('/[\s]+/mu', ' ', $var);
\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);
Без 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;
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']);
Это заменяет все вкладки, все строки новой строки и все комбинации нескольких пространств, вкладок и строк новой строки с одним пробелом.
<?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);
Это то, что я буду использовать:
а. Обязательно используйте двойные кавычки, например:
$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;
Вы можете проверить это на http://writecodeonline.com/php/
Все, что вам нужно, это запустить его следующим образом:
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.
По правде говоря, если вы думаете, что хотите что-то вроде этого:
preg_replace('/\n+|\t+|\s+/',' ',$string);
это заменит несколько вкладок одной вкладкой
preg_replace("/\s{2,}/", "\t", $string);
Без 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) ; ?>
с<?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) ; ?>