Xóa nhiều khoảng trắng


208

Tôi đang nhận được $row['message']từ cơ sở dữ liệu MySQL và tôi cần xóa tất cả các khoảng trắng như \n \tthế.

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

nên được định dạng để:

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

Tôi đã thử:

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

nhưng nó không loại bỏ \nhoặc \t, chỉ một khoảng trống. Bất cứ ai có thể cho tôi biết làm thế nào để làm điều đó?


1
Các ký tự dòng và tab mới nằm trong dấu ngoặc đơn, vì vậy bạn muốn chúng theo nghĩa đen?
Mark Lalor

Tôi đã sửa lỗi trích dẫn mã sectin bằng \ n và \ t bằng cách thay đổi nó thành dấu ngoặc kép.
Butussy Butkus

Câu trả lời:


394

Bạn cần:

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

Bạn đang sử dụng \s\s+có nghĩa là khoảng trắng (khoảng trắng, tab hoặc dòng mới) theo sau là một hoặc nhiều khoảng trắng. Điều này có nghĩa là thay thế hai hoặc nhiều khoảng trắng bằng một không gian duy nhất.

Những gì bạn muốn là thay thế một hoặc nhiều khoảng trắng bằng một khoảng trắng duy nhất, vì vậy bạn có thể sử dụng mẫu \s\s*hoặc \s+(được khuyến nghị)


1
phương pháp của anh ấy tốt hơn thế này: tại sao bạn sẽ thay thế một không gian bằng một không gian?
nickf

16
Anh ta cũng muốn \ n và \ t được thay thế bằng không gian. Bây giờ mẫu của anh ta không khớp với các mẫu này, giả sử $ x = "does \ nthis \ twork"; OP muốn tất cả các khoảng trắng được thay thế bằng một khoảng trắng.
codaddict

@codaddict, làm thế nào chúng ta có thể giữ \ n và xóa tất cả nhiều không gian và tab khác khỏi chuỗi? hãy giúp tôi
Mansoorkhan Cherupuzha

Bạn có thể nói cụ thể hơn tại sao "\ s +" được khuyến nghị không?
Isius

6
Lưu ý rằng trong PHP \skhông bao gồm "tab dọc" chr(11). Để bao gồm nó, bạn cũng cần sử dụng spacelớp ký tự: [[:space:]]+ php.net/manual/en/regapid.reference.character- classes.php
Yaroslav

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

Đầu ra này

This is  a string   with
spaces, tabs and newlines present
---
This is a string with spaces, tabs and newlines present

3
Bạn là một phao cứu sinh thực sự. Tôi định nhảy ra nếu cửa sổ này.
bikey77

Gọn gàng, vẫn hữu ích
spekulatius 4/11/19

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

\s đã chứa các tab và các dòng mới, vì vậy biểu thức regex ở trên dường như là đủ.


2
Dấu ngoặc vuông không cần thiết ở đây vì chỉ có một thứ bên trong chúng. Các /mwont có ảnh hưởng như không có ^hoặc $neo và /usẽ không có bất kỳ tác dụng trừ để làm chậm nó xuống một chút và chết nếu chuỗi đầu vào không hợp lệ UTF-8 (nó không ảnh hưởng gì \sphù hợp, nhưng nó sẽ ảnh hưởng đến \pZ).
thomasrutter

12

đơn giản hóa thành một chức năng:

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

dựa trên câu trả lời của Danuel O'Neal.


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

2
Đây là một trong những làm việc cho tôi tốt nhất. Ngoài ra, tôi sẽ thêm trim để xóa khoảng trắng ở đầu và cuối chuỗi
Dziamid

@Dziamid Bạn có thể làm điều đó với trim (preg numplace (...))
Balázs Varga

7

Tôi không thể lặp lại vấn đề ở đây:

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

Tôi không chắc đó có phải là lỗi phiên âm hay không, nhưng trong ví dụ của bạn, bạn đang sử dụng một chuỗi trích dẫn. \n\tchỉ được coi là dòng mới và tab nếu bạn có một chuỗi trích dẫn kép. Đó là:

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

Chỉnh sửa : như Codaddict đã chỉ ra, \s\s+sẽ không thay thế một ký tự tab. Tôi vẫn không nghĩ rằng sử dụng \s+là một giải pháp hiệu quả, vì vậy làm thế nào về điều này thay vào đó:

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

2
+1, Đúng. Đối với một chuỗi có nhiều khoảng trắng đơn (thường là trường hợp), việc thay thế một không gian bằng không gian là không hiệu quả.
codaddict

1
@coaddict: để kiểm tra giả thuyết của bạn, tôi đã viết một đoạn script nhanh để chạy qua 1000 lần thay thế và kiểm tra thời gian của mỗi lần thay thế. Đối với chuỗi '+1, Đúng. Đối với một chuỗi có nhiều khoảng trắng đơn (thường là trường hợp), việc thay thế một không gian bằng không gian là không hiệu quả. - codaddict 24 tháng 2 \ '10 lúc 13:32 ' , một nghìn cuộc gọi \ s + preg numplace () mất 0,010547876358032 giây và một nghìn (?: \ S \ s + | \ n | \ t ) các cuộc gọi preg numplace () đã thực hiện 0,013049125671387, thực hiện nó chậm hơn gần 30%.
Joseph Cheek

Bạn có thể muốn thêm "\ r" vào ví dụ cuối cùng đó vì một số máy tính tự sử dụng một "\ r" duy nhất (Apple Mac?)
thomasrutter

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

Điều này thay thế tất cả các tab, tất cả các dòng mới và tất cả sự kết hợp của nhiều không gian, tab và dòng mới với một không gian duy nhất.


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);

Hàm tĩnh remove_whitespace là vì lý do gì? Bạn xác định nhưng không bao giờ sử dụng nó.
Lukas Liesis

Những cái này đều có công dụng của chúng nhưng không cái nào trong số chúng sẽ đạt được những gì câu hỏi yêu cầu là thay thế nhiều khoảng trắng liên tiếp chỉ bằng một. "Remove_doublewhitespace" của bạn sẽ chỉ thay thế bội số của cùng một ký tự khoảng trắng, vì vậy nó sẽ thay thế "\ n \ n \ n" với một '', nhưng nó sẽ không làm bất cứ điều gì để "\ r \ n"
thomasrutter

4

Không có preg numplace ()

$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;

2

Tôi sử dụng mã và mẫu này:

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;

Bạn có thể kiểm tra điều này trên http://writecodeonline.com/php/


Nó hoạt động với tôi ngay cả trong mariaDB trong truy vấn này: SELECT search_able, REGEXP_REPLACE (search_able,"\\s+",' ') FROM book where id =260 Vì vậy, Cảm ơn rất nhiều
jalmatari

1

Tất cả bạn cần là để chạy nó như sau:

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

Đây là những gì tôi sẽ sử dụng:

a. Đảm bảo sử dụng dấu ngoặc kép, ví dụ:

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

b. Để xóa khoảng trắng thừa, sử dụng:

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

Nó có thể không phải là giải pháp nhanh nhất, nhưng tôi nghĩ nó sẽ yêu cầu ít mã nhất và nó sẽ hoạt động. Tôi chưa bao giờ sử dụng mysql, vì vậy tôi có thể sai.


1

Trên thực tế, nếu nghĩ rằng bạn muốn một cái gì đó như thế này:

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

1

điều này sẽ thay thế nhiều tab bằng một tab duy nhất

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

-2

Không có preg numplace, với sự trợ giúp của vòng lặp.

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

 ?>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.