Xóa các dòng mới khỏi chuỗi và thay thế bằng một khoảng trống


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

Muốn xóa tất cả các dòng mới từ chuỗi.

Tôi có regex này, nó có thể bắt được tất cả chúng, vấn đề là tôi không biết nên sử dụng chức năng nào.

/\r\n|\r|\n/

$string nên trở thành:

$string = "put returns between paragraphs for linebreak add 2 spaces at end ";

1
Nếu bạn đang thực hiện hàng ngàn thay thế, tránh sử dụng preg_replace. Nó chậm gần gấp đôi str_replace.
Alex W

Bạn có thể thấy s($str)->normalizeLineEndings('')hữu ích, như được tìm thấy trong thư viện độc lập này . Nó sẽ xóa không chỉ LF, CR và CRLF, mà còn bất kỳ dòng mới Unicode nào.
caw

Câu trả lời:


578

Bạn phải thận trọng khi ngắt dòng đôi, điều này sẽ gây ra khoảng trắng kép. Sử dụng biểu thức chính quy thực sự hiệu quả này:

$string = trim(preg_replace('/\s\s+/', ' ', $string));

Nhiều không gian và dòng mới được thay thế bằng một không gian duy nhất.

Chỉnh sửa: Như những người khác đã chỉ ra, giải pháp này có vấn đề khớp với các dòng mới duy nhất ở giữa các từ. Điều này không có trong ví dụ, nhưng người ta có thể dễ dàng thấy tình huống đó có thể xảy ra như thế nào. Một cách khác là làm như sau:

$string = trim(preg_replace('/\s+/', ' ', $string));

10
Trước khi bạn sử dụng giải pháp này, hãy xem câu trả lời của tôi dưới đây và các ý kiến ​​cho câu trả lời của tôi. Giải pháp này có thể không hoạt động như bạn mong đợi.
chiếu sáng

1
trong cụm từ thông dụng "\ s Ghép một ký tự khoảng trắng", tại sao nó lại khớp với một dòng mới?
Michael Z

2
Tôi đã tìm kiếm một giải pháp để loại bỏ / thay thế tất cả các khoảng trắng nhưng không phải (gấp đôi) khoảng trắng. Đây là regex đã làm điều đó:/(?![ ])\s+/
algorardi

Chỉ muốn cho bạn biết rằng giải pháp của bạn đã giúp tôi tiết kiệm rất nhiều thời gian.
Parthapratim Neog

183

Một vài bình luận về câu trả lời được chấp nhận:

+nghĩa là "1 hoặc nhiều hơn". Tôi không nghĩ bạn cần lặp lại \s. Tôi nghĩ rằng bạn chỉ có thể viết '/\s+/'.

Ngoài ra, nếu bạn muốn xóa khoảng trắng trước và cuối trong chuỗi, hãy thêm trim.

Với những sửa đổi này, mã sẽ là:

$string = preg_replace('/\s+/', ' ', trim($string));

Bạn đúng; /\s\s+/sẽ không phù hợp với linefeed trong foo\nbar.
Alan Moore

79

Chỉ dùng preg_replace()

$string = preg_replace('~[\r\n]+~', '', $string);

Bạn có thể thoát khỏi str_replace()cái này, mặc dù mã không được rõ ràng:

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

Xem nó trực tiếp trên ideone


1
OP muốn có một khoảng cách giữa "đoạn văn" và "cho". Nếu bạn chỉ xóa các ký tự dòng mới, sẽ không có ký tự nào.
Daniel Vandersluis

vui lòng sửa nó thành$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

Nếu không thì không còn gì để nói nữa. Đó là câu trả lời đơn giản nhất, tôi nghĩ vậy!
erikbwork

3
@erik Sau đó tôi sẽ "làm phiền" nó. Nó hoạt động tốt như nó là.
NullUserException

1
@Vineet Nó chỉ là một dấu phân cách biểu thị bắt đầu và kết thúc của regex
NullUserException

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

3
Trình tự thoát trong PHP cần phải được trích dẫn gấp đôi.
Daniel Vandersluis

Điều này không thực hiện chính xác những gì OP muốn, vì đây giống như câu trả lời khó nắm bắt và nó không xóa các \rký tự
NullUserException

@NullUser: Tại sao bạn không cập nhật bài viết của mình thay vì bình luận về điều này?
fabrik

@NullUser: Ngoại trừ thực tế, nó thay thế mọi thứ bằng '' thay vì ''.
fabrik

12

Bạn nên sử dụng str numplace cho tốc độ của nó và sử dụng dấu ngoặc kép với một mảng

str_replace(array("\r\n","\r"),"",$string);

Tài nguyên thấp, hoàn hảo, tks.
CONvid19

1
Tôi có thể sai nhưng mã này không loại bỏ dòng char mới trên các hệ thống Unix bởi vì trên các hệ thống đó, dòng mới là chính xác \nvà không phải \r\nvậy, tôi nghĩ rằng OP đang yêu cầu đặt một khoảng trống thay cho dòng mới
Marco Demaio

7

Tôi không chắc liệu điều này có bất kỳ giá trị nào đối với các câu trả lời đã được gửi hay không nhưng tôi cũng có thể đăng nó.

// Create an array with the values you want to replace
$searches = array("\r", "\n", "\r\n");

// Replace the line breaks with a space
$string = str_replace($searches, " ", $string);

// Replace multiple spaces with one
$output = preg_replace('!\s+!', ' ', $string);

6

Việc thay thế regex PCRE có thể được thực hiện bằng cách sử dụng preg numplace: http://php.net/manual/en/feft.preg-replace.php

$new_string = preg_replace("/\r\n|\r|\n/", ' ', $old_string);

Sẽ thay thế dòng mới hoặc trả lại ký tự bằng dấu cách. Nếu bạn không muốn bất cứ điều gì thay thế chúng, hãy thay đổi đối số thứ 2 thành ''.


1
Các pregchức năng sử dụng PCRE, không phải POSIX, biểu thức chính quy. Có những eregchức năng sử dụng POSIX, nhưng hiện tại chúng không được dùng nữa.
Daniel Vandersluis

5

Dùng cái này:

thay thế một loạt các dòng mới bằng một chuỗi rỗng:

$string = preg_replace("/[\\n\\r]+/", "", $string);

hoặc bạn có thể muốn thay thế dòng mới bằng một khoảng trắng:

$string = preg_replace("/[\\n\\r]+/", " ", $string);

Vui lòng định dạng mã của bạn đúng. Điều này được thực hiện bằng cách thụt dòng có liên quan bằng bốn khoảng trắng.
jwueller

2
Đó là lý do tại sao tôi sử dụng các trích dẫn đơn vì vậy tôi không cần phải thoát các ký tự đó. \\nTrông khủng khiếp. \\\\ để phù hợp với một dấu gạch chéo ngược là chỉ là khủng khiếp.
NullUserException

5

Trình tự thoát\R khớp với một dòng mới chung

nghĩa là, bất cứ điều gì được coi là một chuỗi ngắt dòng bằng Unicode. Điều này bao gồm tất cả các ký tự được khớp bởi \v( khoảng trắng dọc ) và chuỗi nhiều ký tự \x0D\x0A...

$string = preg_replace('/\R+/', " ", $string);

Trong chế độ 8 bit không UTF-8 \Rtương đương với các mục sau: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

Bản giới thiệu Regex101


Anton vui lòng kiểm tra, nếu chỉnh sửa của tôi là ok! Đã thêm một số thông tin.
bong bóng bobble

4

Ngắt dòng trong văn bản thường được đại diện là:

\ r \ n - trên máy tính windows

\ r - trên máy tính Apple

\ n - trên Linux

//Removes all 3 types of line breaks

$string = str_replace("\r", "", $string);

$string = str_replace("\n", "", $string);

3

Những gì về:

$string = trim( str_replace( PHP_EOL, ' ', $string ) );

Đây sẽ là một giải pháp khá mạnh mẽ vì \ n không hoạt động chính xác trong tất cả các hệ thống nếu tôi không sai ...


Điều này dường như không thay thế \ r mà chỉ là \ n: ideone.com/28KPcb
T30

Như đã đề cập trong hướng dẫn PHP_EOL chứa biểu tượng 'End Of Line' chính xác cho nền tảng hiện tại. Nếu bạn nhập chuỗi từ các nền tảng khác hoặc bạn vừa có chuỗi định dạng xấu, điều này có thể bị hỏng.
GDY

Nếu bạn có một môi trường khá khép kín thì đây có vẻ là giải pháp tao nhã nhất đối với tôi bởi vì nền tảng của nó độc lập và có thể hoạt động tốt nếu bạn có đầu vào rộng hơn như kịch bản nhập / xuất, bạn có thể nên sử dụng giải pháp regex.
GDY

3

Tôi đã ngạc nhiên khi thấy mọi người ít biết về regex.

Dải dòng mới trong php là

$str = preg_replace('/\r?\n$/', ' ', $str);

Trong perl

$str =~ s/\r?\n$/ /g;

Có nghĩa là thay thế bất kỳ ký tự dòng mới nào ở cuối dòng (cho hiệu quả) - tùy chọn đi trước bởi một sự trở lại vận chuyển - bằng một khoảng trắng.

\ n hoặc \ 015 là dòng mới. \ r hoặc \ 012 là vận chuyển trở lại. ? trong regex có nghĩa là khớp 1 hoặc 0 của ký tự trước. $ trong regex có nghĩa là kết thúc khớp dòng.

Tham chiếu regex gốc và tốt nhất là perldoc perlre, mọi lập trình viên nên biết tài liệu này khá rõ: http://perldoc.perl.org/perlre.html Lưu ý không phải tất cả các tính năng đều được hỗ trợ bởi tất cả các ngôn ngữ.


Giải pháp này không hiệu quả với tôi nhưng như đã đề cập, tôi sẽ cần đọc thêm để đưa ra giải pháp thực tế. Tôi đã ngạc nhiên khi điều này không làm việc.
Adam Whateverson

2

đây là mẫu tôi sẽ sử dụng

$string = preg_replace('@[\s]{2,}@',' ',$string);

2

có thể điều này hoạt động:

$str='\n';
echo str_replace('\n','',$str);


1

Bạn có thể thử mã dưới đây sẽ giữ bất kỳ dòng trắng và dòng mới nào trong văn bản của bạn.

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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

1

Nhiều giải pháp trong số đó không hiệu quả với tôi. Điều này đã làm mẹo mặc dù: -

$svgxml = preg_replace("/(*BSR_ANYCRLF)\R/",'',$svgxml);

Đây là tài liệu tham khảo: - PCRE và dòng mới


0

mã dưới đây hoạt động tất cả các văn bản xin vui lòng sử dụng nó:

$des = str_replace('\n',' ',$des);
$des = str_replace('\r',' ',$des);

0

Bạn có thể loại bỏ dòng mới và nhiều khoảng trắng.

$pattern = '~[\r\n\s?]+~';
$name="test1 /
                     test1";
$name = preg_replace( $pattern, "$1 $2",$name);

echo $name;
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.