Làm cách nào để loại bỏ ngắt dòng (không có ký tự!) Khỏi chuỗi?


146

Điều này có vẻ như là một bản sao, nhưng yên tâm là không - tôi đã tìm kiếm cả SO cũng như phần còn lại của web để tìm câu trả lời cho vấn đề của mình và cuối cùng tìm thấy "giải pháp" không đủ. Dù sao đi nữa, nó đi:

Tôi đang lưu dữ liệu đầu vào của người dùng từ textarea vào cơ sở dữ liệu MySQL (trong môi trường WordPress, nhưng điều đó không quan trọng đối với vấn đề này, tôi tin vậy). Sau đó, nó được lấy từ DB để hiển thị cho Quản trị viên trong phần phụ trợ của trang web. Sự cố xảy ra khi người dùng gửi văn bản có ngắt dòng (tức là nhấn phím Enter).

Một chuỗi mẫu có thể trông như thế này:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!

Greetings,
Bill

Không có kết thúc của các ký tự dòng ("\ n", "\ r" hoặc tương tự) trong chuỗi.

Tôi đang sử dụng nl2br()nó để tạo đầu ra HTML, nhưng điều đó là không đủ. Kết quả sau đó là:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill

Theo như tôi hiểu thì đó là nl2br()kết quả mong đợi , vì nó chèn các thẻ và không được phép thay thế các ngắt dòng ở vị trí đầu tiên?

Tuy nhiên định dạng tôi cần sẽ là:

Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br /><br />Greetings,<br />Bill

Nếu chuỗi có các ký tự EOL như "\ n" trong đó, tôi sẽ đánh nó bằng hoặc str_replace()hoặc preg_replace()được thực hiện với nó, nhưng tôi không biết kim nào để cung cấp một trong hai chức năng đó nếu không có ký tự nào ở đó ở nơi đầu tiên

Tôi có thể truy cập thủ công vào trường có liên quan trong DB, nhấn Backspace cho mỗi lần ngắt dòng và những gì sau này tôi muốn làm với chuỗi hoạt động. Vì vậy, tôi biết tôi cần định dạng trên.


Nếu chuỗi trông giống như ví dụ đầu tiên của bạn, thì làm sao bạn có thể nói nó không có ký tự ngắt dòng trong đó? Nó có ít nhất hai: hai liên tiếp sau khi "cảm ơn!"
Ernest Friedman-Hill

Enuff công bằng @ ErnestFriedman-Hill, bạn rõ ràng đúng - có "cái gì đó" ở đó, nó không thể nhìn thấy không phải bất cứ điều gì tôi biết.
Julian Pille

Tôi cũng không thể thấy làm thế nào có thể có các dòng mới mà không có các ký tự ngắt dòng. Bạn có thể sử dụng một trình soạn thảo hex để kiểm tra chuỗi - Tôi chắc chắn bạn sẽ tìm thấy những ký tự cho dòng mới ...
nettle

Câu trả lời:


376

Bạn sẽ có thể thay thế nó bằng một preg loại bỏ tất cả các dòng mới và trả lại vận chuyển. Mã này là:

preg_replace( "/\r|\n/", "", $yourString );

Mặc dù các \nnhân vật không xuất hiện, nhưng nếu bạn nhận được xe ngựa trở về thì có một nhân vật vô hình ở đó. Các preg thay thế nên lấy và sửa chúng.


Không thể tin được. Tôi có thể đã thề sẽ thử mọi thứ dọc theo câu trả lời của bạn và @bsdnoobz, cả hai đều thực hiện công việc. Ồ, bất kể khối tâm thần nào tôi có ở đó, cả hai bạn đều tiết kiệm cho tôi hàng tấn thời gian. Hóa ra là một câu hỏi khá hay, tôi đoán vậy. Cảm ơn các bạn!
Julian Pille

3
Lưu ý rằng điều này sẽ không khớp với tất cả các ngắt dòng, tức là những thứ được tạo trên hệ thống Windows. Để nắm bắt những điều này, bạn có thể sử dụng RegEx sau đây/\r|\n|\r\n/
Toastrackenigma

6
sử dụng \ R (đại diện cho bất kỳ chuỗi kết thúc dòng nào) stackoverflow.com/a/16274784/1491212
Armel Larcier

435

Giải pháp của Ben có thể chấp nhận được, nhưng str numplace () nhanh hơn nhiều so với preg numplace ()

$buffer = str_replace(array("\r", "\n"), '', $buffer);

Sử dụng ít năng lượng CPU, giảm lượng khí thải carbon dioxide trên thế giới.


5
Không thể tin câu trả lời này không nhận được nhiều tín nhiệm hơn. 100 ngón tay cái cho đến nay trên
preg numplace

62
QUAN TRỌNG: Sử dụng SỐ LƯỢNG NHÂN ĐÔI xung quanh mã vận chuyển và mã mới. Chúng sẽ không được xử lý chính xác nếu bạn sử dụng dấu ngoặc đơn!
bwright

47
Đồng ý -> "Sử dụng ít năng lượng CPU hơn, giảm lượng khí thải carbon dioxide trên thế giới."
Ngày

3
@Joeri: Cái cuối cùng đó sẽ không bao giờ được gọi vì nó sẽ được xử lý bởi hai cái đầu tiên. Đó là mã dự phòng.
nightfox89

4
@Joeri Xem xét str numplace sẽ loại bỏ tất cả các lần xuất hiện, liệu \ \ và cả hai TẤT CẢ có bị xóa không?
Bram Vanroy

16
$str = "
Dear friends, I just wanted so Hello. How are you guys? I'm fine, thanks!<br />
<br />
Greetings,<br />
Bill";

echo str_replace(array("\n", "\r"), '', $str);  // echo $str in a single line

11

Đó là bởi vì nl2br()không loại bỏ các dòng mới.

Returns chuỗi với <br />hoặc <br> chèn vào trước tất cả các dòng mới ( \r\n, \n\r, \n\r).

Sử dụng str_replacethay thế:

$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);

7

Bạn cũng có thể sử dụng PHP trim

Hàm này trả về một chuỗi với khoảng trắng được tước từ đầu và cuối của str. Không có tham số thứ hai, trim () sẽ loại bỏ các ký tự này:

  • "" (ASCII 32 (0x20)), một không gian bình thường.
  • "\ t" (ASCII 9 (0x09)), một tab.
  • "\ n" (ASCII 10 (0x0A)), một dòng mới (nguồn cấp dữ liệu).
  • "\ r" (ASCII 13 (0x0D)), tiền lãi vận chuyển.
  • "\ 0" (ASCII 0 (0x00)), byte NUL.
  • "\ x0B" (ASCII 11 (0x0B)), một tab dọc.

3
Điều này sẽ chỉ nhắm mục tiêu các dòng mới ở đầu và cuối chuỗi. Các dòng mới ở giữa chuỗi sẽ không được sử dụng.
mickmackusa

6

Để hoạt động chính xác trên Windows, tôi khuyên bạn nên sử dụng

$buffer = str_replace(array("\r\n", "\r", "\n"), "", $buffer);

"\r\n"- cho Windows, "\r"- cho Mac và "\n"- cho Linux


2
Xin lỗi người bạn đời, nhưng thậm chí đã từng là người hỏi lại trong '12, tôi có thể nói với bạn một cách chắc chắn tuyệt đối rằng điều này là dư thừa. Hãy tự hỏi mình những điều sau: Nếu tất cả \r\nđược loại bỏ trong chuỗi, tại sao điều đó không xảy ra đối với những người theo dõi trực tiếp nhau?
Julian Pille

Thực sự, điều hiển nhiên này không xuất hiện trong đầu tôi ... Cảm ơn :) Tôi mới nhận ra rằng tôi đã gặp rắc rối với nó, nhưng nó là cách khác, tôi đã sử dụng \r\ntrên Windows và nó không hoạt động trên Linux.
Ajjaah

Chà, tôi đang sử dụng chức năng này để thay thế dấu ngắt dòng bằng dấu phẩy nên một địa chỉ là một văn bản dòng đơn, vì vậy thay thế \r\nFIRST sẽ giúp ích, vì điều đó có nghĩa là một dấu phẩy thay vì hai dấu phẩy cho mỗi phần nếu dòng đó bị ngắt
Martin

@Martin Vâng, bạn nói đúng, tôi cũng nhận ra điều tương tự, vì vậy chúng tôi thay thế \r\ntrước, sau đó chúng tôi thay thế \r\n, tôi đã chỉnh sửa câu trả lời của mình.
Ajjaah

Điều này vẫn còn thừa, nếu bạn sẽ loại bỏ tất cả \r\r, không cần phải loại bỏ \r\n, bạn có thể sử dụng str_replace(array("\r","\n"), "", $buffer);để có được kết quả tương tự.
stramin

6

str numplace (PHP_EOL, null, $ str);


1
trong khi điều này có thể trả lời câu hỏi. Nên giải thích một chút về câu trả lời của bạn.
Anirudh Sharma

PHP_EOL không luôn hoạt động khi bạn đọc chuỗi. Nó làm khi bạn viết chúng.
nightfox89

Các câu trả lời chỉ có mã là giá trị thấp trên StackOverflow vì chúng làm rất ít để giáo dục OP và các độc giả tương lai.
mickmackusa

4

Một cái gì đó nhiều chức năng hơn (dễ sử dụng ở bất cứ đâu):

function strip_carriage_returns($string)
{
    return str_replace(array("\n\r", "\n", "\r"), '', $string);
}

Sử dụng PHP_EOL làm tham số thay thế tìm kiếm cũng là một ý tưởng hay! Thanh danh.


1

Tích hợp thay thế: trim ()

trim  Strip whitespace (or other characters) from the beginning and end of a string
Description 
trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

This function returns a string with whitespace stripped from the beginning and end of str.
Without the second parameter, trim() will strip these characters:

    " " (ASCII 32 (0x20)), an ordinary space.
    "\t" (ASCII 9 (0x09)), a tab.
    "\n" (ASCII 10 (0x0A)), a new line (line feed).
    "\r" (ASCII 13 (0x0D)), a carriage return.
    "\0" (ASCII 0 (0x00)), the NUL-byte.
    "\x0B" (ASCII 11 (0x0B)), a vertical tab.

Nó ở đó để loại bỏ ngắt dòng khỏi các loại tệp văn bản khác nhau, nhưng không xử lý html.


0

Tôi sử dụng 3 dòng để thực hiện công việc này, vì vậy hãy coi $ s là "công cụ" của bạn ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
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.