2010-02-24 44 views
151

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ả khoảng trắng như \n\t và cứ tiếp tục như vậy.Xóa nhiều khoảng trắng

$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 đã cố gắng:

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

nhưng nó không loại bỏ \n hoặc \t, chỉ cần không gian duy nhất. Bất cứ ai có thể cho tôi biết làm thế nào để làm điều đó?

+1

Ký tự dòng mới và tab nằm trong dấu nháy đơn, vì vậy bạn muốn chúng theo nghĩa đen? –

+0

Tôi đã cố định trích dẫn của mã sectin bằng \ n và \ t bằng cách thay đổi nó thành dấu ngoặc kép. –

+2

@creativz bạn đánh dấu câu trả lời được chấp nhận như thế nào? Bốn năm là đủ để quyết định cái nào là tốt nhất cho bạn;) – Andrew

Trả lời

294

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 (space, tab hoặc newline) tiếp theo 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 khoảng trống duy nhất.

gì bạn muốn là thay thế một hoặc khoảng trắng hơn với khoảng trắng duy nhất, do đó bạn có thể sử dụng mô hình \s\s* hay \s+ (đề nghị)

+1

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

+14

Anh ấy 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 phù hợp với những thứ này, giả sử $ x = "does \ nnthis \ twork"; OP muốn tất cả khoảng trắng được thay thế bằng một khoảng trắng. – codaddict

+0

@codaddict, cách chúng tôi có thể giữ \ n và xóa tất cả các không gian và tab khác khỏi chuỗi? hãy giúp tôi –

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

Đây là cách phù hợp nhất với tôi. Ngoài ra, tôi sẽ thêm cắt để xóa khoảng trắng ở đầu và cuối của chuỗi – Dziamid

+0

@Dziamid Bạn có thể làm điều đó với trim (preg_replace (...)) –

7

tôi không thể tái tạo các 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 được trích dẫn một lần. \n\t chỉ được coi là dòng mới và tab nếu bạn có chuỗi được trích dẫn kép. Đó là:

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

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

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

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

+1

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

+0

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 sử dụng một "\ r" đơn lẻ (Apple Mac?) – thomasrutter

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

này kết quả đầu ra

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

Bạn là một phao cứu sinh thực sự. Tôi sắp nhảy ra ngoài nếu cửa sổ trên đó. – bikey77

0

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. 
4
preg_replace('/(\s\s+|\t|\n)/', ' ', $row['message']); 

Thao tác này sẽ thay thế tất cả các tab, tất cả các dòng mới và tất cả các kết hợp của nhiều dấu cách, tab và dòng mới bằng một dấu cách.

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; 

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

3
<?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); 
+0

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

+0

Những cái này đều có sử dụng nhưng không cái nào trong số này sẽ đạt được những gì mà 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ế nhiều ký tự khoảng trắng * giống nhau, vì vậy nó sẽ thay thế "\ n \ n \ n" bằng dấu "', nhưng nó sẽ không làm bất kỳ điều gì" \ r \ n " – thomasrutter

1

tôi sử dụng đoạn mã này và mẫu:

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/

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

\s đã có chứa các tab và dây chuyền mới, vì vậy regex trên điều này dường như là đủ .

+1

Dấu ngoặc vuông không cần ở đây vì chỉ có một thứ bên trong chúng. '/ M' sẽ không có hiệu ứng vì không có'^'hoặc' $ 'anchors và'/u' sẽ không có hiệu ứng nào ngoại trừ làm chậm nó xuống và chết nếu chuỗi đầu vào không hợp lệ UTF- 8 (nó không ảnh hưởng đến những gì '\ s' phù hợp, nhưng nó sẽ ảnh hưởng đến' \ pZ'). – thomasrutter

0

Trên sự thậ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); 
0

này sẽ thay thế nhiều tab với một tab đơn

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

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

được đơ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.

0

Nếu không có preg_replace, 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) ; 

?> 
Các vấn đề liên quan