ลบบรรทัดใหม่ออกจากสตริงและแทนที่ด้วยหนึ่งช่องว่าง


291
$string = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

ต้องการลบบรรทัดใหม่ทั้งหมดออกจากสตริง

ฉันมี regex นี้มันสามารถจับพวกเขาทั้งหมดปัญหาคือฉันไม่รู้ด้วยฟังก์ชั่นที่ฉันควรใช้

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

$string ควรกลายเป็น:

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

1
หากคุณกำลังทำสิ่งทดแทนหลายพันpreg_replaceรายการ str_replaceมันเป็นเกือบสองเท่าช้า
Alex W

คุณอาจพบว่ามีs($str)->normalizeLineEndings('')ประโยชน์ดังที่พบในไลบรารีแบบสแตนด์อโลนนี้ มันจะลบไม่เพียง LF, CR และ CRLF แต่ยังขึ้นบรรทัดใหม่ Unicode
caw

คำตอบ:


578

คุณต้องระวังการขึ้นบรรทัดใหม่ซึ่งจะทำให้เกิดช่องว่างสองครั้ง ใช้การแสดงออกปกติที่มีประสิทธิภาพจริงๆ:

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

ช่องว่างและบรรทัดใหม่หลายรายการจะถูกแทนที่ด้วยช่องว่างเดียว

แก้ไข:ตามที่คนอื่น ๆ ได้ชี้ให้เห็นการแก้ปัญหานี้มีปัญหาตรงกับขึ้นบรรทัดใหม่เดียวในระหว่างคำ สิ่งนี้ไม่ได้มีอยู่ในตัวอย่าง แต่สามารถเห็นได้ง่ายว่าสถานการณ์นั้นจะเกิดขึ้นได้อย่างไร ทางเลือกคือทำสิ่งต่อไปนี้:

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

10
ก่อนที่คุณจะใช้โซลูชันนี้โปรดดูคำตอบของฉันด้านล่างและความคิดเห็นต่อคำตอบของฉัน วิธีนี้อาจไม่ทำงานอย่างที่คุณคาดไว้
matsolof

1
ในนิพจน์ทั่วไป "\ s จับคู่อักขระช่องว่าง" ทำไมจึงตรงกับบรรทัดใหม่
Michael Z

2
ฉันค้นหาวิธีแก้ไขเพื่อลบ / แทนที่ช่องว่างทั้งหมด แต่ไม่ใช่ช่องว่าง (สองเท่า) นี่คือ regex ที่ทำ:/(?![ ])\s+/
algorhythm

แค่อยากให้คุณรู้ว่าทางออกของคุณช่วยฉันได้มากเวลา
Parthapratim Neog

183

ความคิดเห็นเล็กน้อยเกี่ยวกับคำตอบที่ยอมรับได้:

+หมายถึง "1 หรือมากกว่า" \sผมไม่คิดว่าคุณจะต้องทำซ้ำ ฉันคิดว่าคุณสามารถเขียน'/\s+/'ได้

trimนอกจากนี้ถ้าคุณต้องการที่จะลบช่องว่างแรกและครั้งสุดท้ายในสตริงเพิ่ม

ด้วยการแก้ไขเหล่านี้รหัสจะเป็น:

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

คุณถูก; จะล้มเหลวเพื่อให้ตรงกับเลื่อนบรรทัดใน/\s\s+/ foo\nbar
อลันมัวร์

79

เพียงแค่ใช้ preg_replace()

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

คุณสามารถลบล้างstr_replace()สิ่งนี้ได้แม้ว่าโค้ดจะดูไม่สะอาด:

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

ดูมันอยู่บนideone


1
OP ต้องการช่องว่างระหว่าง "ย่อหน้า" และ "สำหรับ" หากคุณเพิ่งลบอักขระบรรทัดใหม่จะไม่มี
Daniel Vandersluis

โปรดแก้ไขให้ถูกต้อง$string = preg_replace("~[\r\n]~", "",$string);
erikbwork

ไม่อย่างนั้นไม่มีอะไรจะพูดอีกแล้ว นั่นคือคำตอบที่ง่ายที่สุดฉันคิดว่า!
erikbwork

3
@erik จากนั้นฉันจะ "แก้ไข" มัน มันทำงานได้ดีอย่างที่มันเป็น
NullUserException

1
@Vineet มันเป็นเพียงตัวคั่นแสดงถึงจุดเริ่มต้นและจุดสิ้นสุดของ regex
NullUserException

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

3
Escape sequences ใน PHP จะต้องมีการเสนอราคาซ้ำ
Daniel Vandersluis

สิ่งนี้ไม่ได้เป็นไปตามที่ OP ต้องการเนื่องจากนี่เป็นคำตอบที่เข้าใจยากและมันไม่ได้ลบ\rตัวอักษรออกไป
NullUserException

@NullUser: ทำไมคุณไม่อัปเดตโพสต์ของคุณเองแทนที่จะแสดงความคิดเห็นในเรื่องนี้
fabrik

@NullUser: ยกเว้นความจริงมันแทนที่ทุกอย่างด้วย '' แทน ''
fabrik

12

คุณควรใช้ str_replace สำหรับความเร็วและใช้เครื่องหมายคำพูดคู่กับอาเรย์

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

ทรัพยากรต่ำสมบูรณ์แบบ tks
CONVID19 19

1
ฉันอาจจะผิด แต่รหัสนี้ไม่ลบ char บรรทัดใหม่บนระบบ Unix เพราะในระบบเหล่านั้นขึ้นบรรทัดใหม่เป็นเพียง\nและไม่\r\nนอกจากนั้นฉันคิดว่า OP ขอให้ใส่ช่องว่างเดียวแทนที่บรรทัดใหม่
Marco Demaio

7

ฉันไม่แน่ใจว่านี่มีค่าใด ๆ กับคำตอบที่ส่งไปแล้วหรือไม่ แต่ฉันก็สามารถโพสต์ได้เช่นกัน

// 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

การทดแทน Regex ของ PCRE สามารถทำได้โดยใช้ preg_replace: http://php.net/manual/th/function.preg-replace.php

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

จะแทนที่บรรทัดใหม่หรือคืนอักขระด้วยช่องว่าง ''หากคุณไม่ต้องการอะไรเพื่อแทนที่พวกเขาเปลี่ยนอาร์กิวเมนต์ที่ 2


1
pregฟังก์ชั่นใช้ PCRE ไม่ POSIX, การแสดงออกปกติ มีeregฟังก์ชั่นที่ใช้ POSIX แต่ตอนนี้จะเลิกใช้แล้ว
Daniel Vandersluis

5

ใช้สิ่งนี้:

แทนที่ชุดของบรรทัดใหม่ด้วยสตริงว่าง:

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

หรือคุณอาจต้องการแทนที่บรรทัดใหม่ด้วยช่องว่างเดียว:

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

กรุณาจัดรูปแบบรหัสของคุณอย่างถูกต้อง ทำได้โดยการเยื้องบรรทัดที่เกี่ยวข้องด้วยช่องว่างสี่ช่อง
jwueller

2
นั่นเป็นเหตุผลที่ฉันใช้เครื่องหมายคำพูดเดี่ยวดังนั้นฉันจึงไม่จำเป็นต้องหลบเลี่ยงตัวละครเหล่านั้น \\nดูน่ากลัว \\\\ เพื่อให้ตรงกับแบ็กสแลชเดียวอันยิ่งใหญ่
NullUserException

5

ลำดับหนี\Rตรงกับบรรทัดใหม่ทั่วไป

นั่นคือสิ่งใดก็ตามที่ถือว่าเป็นลำดับการแยกบรรทัดโดย Unicode ซึ่งรวมถึงอักขระทั้งหมดที่จับคู่ด้วย\v( ช่องว่างแนวตั้ง ) และลำดับอักขระหลายตัว\x0D\x0A...

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

ในโหมด 8 บิตที่ไม่ใช่ UTF-8 \Rจะเทียบเท่ากับสิ่งต่อไปนี้: (?>\r\n|\n|\x0b|\f|\r|\x85)... pcre.org

การสาธิต Regex101


แอนตันโปรดตรวจสอบหากการแก้ไขของฉันใช้ได้! เพิ่มข้อมูลเพิ่มเติม
ฟองกลมกลม

4

โดยทั่วไปตัวแบ่งบรรทัดในข้อความจะแสดงเป็น:

\ r \ n - บนคอมพิวเตอร์ที่ใช้ windows

\ r - บนคอมพิวเตอร์ Apple

\ n - บน Linux

//Removes all 3 types of line breaks

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

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

3

เกี่ยวกับอะไร:

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

นี่ควรเป็นโซลูชันที่มีประสิทธิภาพเพราะ \ n ทำงานไม่ถูกต้องในทุกระบบหากฉันไม่ผิด ...


ดูเหมือนจะไม่ได้แทนที่ \ r แต่เพียงแค่ \ n: ideone.com/28KPcb
T30

ดังที่ได้กล่าวไว้ในคู่มือ PHP_EOL ประกอบด้วยสัญลักษณ์ 'End Of Line' ที่ถูกต้องสำหรับแพลตฟอร์มปัจจุบัน หากคุณนำเข้าสตริงจากแพลตฟอร์มอื่นหรือคุณมีสตริงที่จัดรูปแบบไม่ถูกต้องสิ่งนี้อาจแตก
GDY

หากคุณมีสภาพแวดล้อมที่ปิดสนิทสิ่งนี้ดูเหมือนจะเป็นทางออกที่ดีที่สุดสำหรับฉันเพราะแพลตฟอร์มของมันเป็นอิสระและอาจมีประสิทธิภาพมาก ... หากคุณมีอินพุตที่กว้างขึ้นเช่นสถานการณ์การนำเข้า / ส่งออกคุณควรใช้โซลูชัน regex
GDY

3

ฉันประหลาดใจที่เห็นว่าทุกคนรู้น้อยเกี่ยวกับ regex

ตัดบรรทัดใหม่ใน php คือ

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

ใน perl

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

ความหมายจะแทนที่อักขระขึ้นบรรทัดใหม่ที่ท้ายบรรทัด (เพื่อประสิทธิภาพ) - นำหน้าด้วย carriage return - ด้วยช่องว่าง

\ n หรือ \ 015 เป็นบรรทัดใหม่ \ r หรือ \ 012 คือการคืนสินค้า ? ใน regex หมายถึงการจับคู่ 1 หรือศูนย์ของตัวละครก่อนหน้า $ ใน regex หมายถึงการจับคู่จุดสิ้นสุดของบรรทัด

การอ้างอิง regex ดั้งเดิมและดีที่สุดคือ perldoc perlre, coder ทุกคนควรรู้ว่าเอกสารนี้ค่อนข้างดี: http://perldoc.perl.org/perlre.html หมายเหตุ: คุณสมบัติบางอย่างนั้นไม่ได้รับการสนับสนุนในทุกภาษา


โซลูชันนี้ใช้งานไม่ได้สำหรับฉัน แต่ตามที่กล่าวมาฉันจะต้องอ่านเพิ่มเติมเพื่อผลิตโซลูชันจริง ฉันประหลาดใจที่มันไม่ทำงาน
Adam Whateverson




1

คุณสามารถลองรหัสด้านล่างจะรักษาพื้นที่สีขาวและบรรทัดใหม่ในข้อความของคุณ

$str = "
put returns between paragraphs

for linebreak add 2 spaces at end

";

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


0

โค้ดด้านล่างนี้ใช้กับข้อความทั้งหมดได้โปรดใช้:

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

0

คุณสามารถลบบรรทัดใหม่และช่องว่างสีขาวหลาย ๆ

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

echo $name;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.