วิธีลบตัวแบ่งบรรทัด (ไม่มีอักขระ!) ออกจากสตริง?


146

สิ่งนี้อาจดูเหมือนเป็นล่อลวง แต่มั่นใจได้ว่าไม่ใช่ - ฉันได้ค้นหาทั้ง SO และส่วนที่เหลือของเว็บเพื่อหาคำตอบสำหรับปัญหาของฉันและจบลงด้วยการหาวิธีแก้ปัญหาที่ไม่เพียงพอเหมือนเดิม อย่างไรก็ตามมันจะไปที่นี่:

ฉันบันทึกการป้อนข้อมูลของผู้ใช้จาก textarea ไปยังฐานข้อมูล MySQL (ภายในสภาพแวดล้อม WordPress แต่นั่นไม่น่าจะมีความสำคัญกับปัญหานี้ฉันเชื่อ) จะถูกเรียกคืนจากฐานข้อมูลเพื่อแสดงต่อผู้ดูแลระบบในส่วนหลังของไซต์ ปัญหาเกิดขึ้นเมื่อผู้ใช้ส่งข้อความที่มีตัวแบ่งบรรทัด (เช่นกดปุ่ม Enter)

สตริงตัวอย่างอาจมีลักษณะเช่นนี้:

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

Greetings,
Bill

ไม่มีจุดสิ้นสุดของอักขระบรรทัด ("\ n", "\ r" หรือสิ่งที่คล้ายกัน) ในสตริง

ฉันใช้nl2br()มันเพื่อสร้างเอาต์พุต HTML แต่ยังไม่เพียงพอ ผลลัพธ์ก็คือ:

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

ซึ่งเท่าที่ฉันเข้าใจมันเป็นnl2br()ผลลัพธ์ที่คาดหวังเมื่อแทรกแท็กและไม่ควรแทนที่การแบ่งบรรทัดในตอนแรก

อย่างไรก็ตามรูปแบบที่ฉันต้องการก็คือ:

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

ถ้าสตริงมีอักขระ EOL เช่น "\ n" อยู่ในนั้นฉันจะกดมันด้วยstr_replace()หรือpreg_replace()ทำด้วย แต่ฉันไม่มีเงื่อนงำอะไรที่จะให้ฟีดอย่างใดอย่างหนึ่งของฟังก์ชั่นเหล่านั้นถ้าไม่มีตัวอักษรที่นั่น ในที่แรก.

ฉันสามารถเข้าถึงฟิลด์ที่เกี่ยวข้องในฐานข้อมูลได้ด้วยตนเองกด Backspace สำหรับทุก ๆ การแบ่งบรรทัดและสิ่งที่ฉันต้องการจะทำภายหลังเมื่อสตริงทำงาน ดังนั้นฉันรู้ว่าฉันต้องการรูปแบบข้างต้น


หากสตริงดูเหมือนตัวอย่างแรกของคุณคุณจะพูดได้อย่างไรว่าไม่มีอักขระตัวแบ่งบรรทัด มีอย่างน้อยสอง: สองรายการติดกันหลังจาก "ขอบคุณ!"
Ernest Friedman-Hill

Fair enuff @ ErnestFriedman-Hill คุณเห็นได้ชัดว่ามี "บางอย่าง" อยู่ที่นั่นมันแค่มองไม่เห็นไม่ใช่สิ่งที่ฉันรู้
Johannes Pille

ฉันไม่สามารถเห็นได้ว่าจะมีบรรทัดใหม่อย่างไรโดยไม่มีอักขระขึ้นบรรทัดใหม่ คุณสามารถใช้ hex editor ในการตรวจสอบสตริงได้หรือไม่ - ฉันแน่ใจว่าคุณจะพบอักขระสำหรับบรรทัดใหม่ ...
nettle

คำตอบ:


376

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

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

แม้ว่า\nตัวละครจะไม่ปรากฏ แต่ถ้าคุณได้รับ carriage return ก็จะมีตัวละครที่มองไม่เห็นอยู่ตรงนั้น การแทนที่ preg ควรคว้าและแก้ไขสิ่งเหล่านั้น


เหลือเชื่อ. ฉันสาบานได้ว่าจะลองทุกอย่างตามสายงานของคุณและ @bsdnoobz ตอบซึ่งทั้งสองทำงาน โอ้ดีบล็อกอะไรที่ฉันมีที่นั่นคุณทั้งสองช่วยฉันได้หลายครั้ง กลายเป็นคำถามที่ค่อนข้างบ้าคลั่งฉันเดา ขอบคุณเพื่อน!
Johannes Pille

3
โปรดทราบว่าสิ่งนี้จะไม่ตรงกับตัวแบ่งบรรทัดทั้งหมดเช่นที่สร้างขึ้นในระบบ Windows เพื่อจับสิ่งเหล่านี้คุณสามารถใช้ RegEx ต่อไปนี้แทน/\r|\n|\r\n/
Toastrackenigma

6
ใช้ \ R (ซึ่งแทนลำดับการจบบรรทัดใด ๆ ) stackoverflow.com/a/16274784/1491212
Armel Larcier

435

โซลูชันของ Benเป็นที่ยอมรับ แต่str_replace ()นั้นเร็วกว่าpreg_replace ()

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

ใช้พลังงาน CPU น้อยลงลดการปล่อยก๊าซคาร์บอนไดออกไซด์โลก


5
ไม่อยากเชื่อเลยว่าคำตอบนี้จะไม่ได้รับความน่าเชื่อถือมากขึ้น 100 thumbs ถึงเรื่องนี้มากกว่า preg_replace ()
pimbrouwers

62
สำคัญ: ใช้ QUOTES สองเท่ารอบ ๆ carriage-return และ newline codes สิ่งเหล่านี้จะไม่ได้รับการประมวลผลอย่างถูกต้องหากคุณใช้เครื่องหมายคำพูดเดี่ยว!
bwright

47
Thumbs up -> "การใช้พลังงาน CPU น้อยลงช่วยลดการปล่อยก๊าซคาร์บอนไดออกไซด์โลก"
มกราคม

3
@Joeri: อันสุดท้ายจะไม่ถูกเรียกเพราะมันจะถูกจัดการโดยสองคนแรก มันเป็นรหัสซ้ำซ้อน
nightfox89

4
@Joeri พิจารณาว่า str_replace จะลบสิ่งที่เกิดขึ้นทั้งหมดจะไม่ \ r และ \ n ทั้งสองอย่างถูกลบออกไปหรือไม่
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

เป็นเพราะnl2br()ไม่ได้ลบบรรทัดใหม่เลย

ผลตอบแทนสตริงด้วย<br />หรือ<br> แทรกก่อนที่จะขึ้นบรรทัดใหม่ทั้งหมด ( \r\n, \n\r, \nและ\r)

ใช้str_replaceแทน:

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

7

คุณยังสามารถใช้การตัดแต่ง PHP

ฟังก์ชันนี้ส่งคืนสตริงที่ช่องว่างถูกตัดออกจากจุดเริ่มต้นและจุดสิ้นสุดของ str ไม่มีพารามิเตอร์ตัวที่สอง trim () จะตัดอักขระเหล่านี้:

  • "" (ASCII 32 (0x20)) พื้นที่ว่างทั่วไป
  • "\ t" (ASCII 9 (0x09)) แท็บ
  • "\ n" (ASCII 10 (0x0A)) บรรทัดใหม่ (ตัวดึงข้อมูลบรรทัด)
  • "\ r" (ASCII 13 (0x0D)), carriage return
  • "\ 0" (ASCII 0 (0x00)), NUL- ไบต์
  • "\ x0B" (ASCII 11 (0x0B)) แท็บแนวตั้ง

3
สิ่งนี้จะกำหนดเป้าหมายการขึ้นบรรทัดใหม่เมื่อเริ่มต้นและสิ้นสุดของสตริงเท่านั้น บรรทัดใหม่ที่อยู่ตรงกลางของสตริงจะไม่ถูกแตะต้อง
mickmackusa

6

เพื่อให้ทำงานบน Windows ได้อย่างถูกต้องฉันแนะนำให้ใช้

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

"\r\n"- สำหรับ Windows "\r"- สำหรับ Mac และ"\n"- สำหรับ Linux


2
ขออภัยเพื่อน แต่แม้จะเป็นคนที่ขอกลับมาใน '12 ฉันสามารถบอกคุณได้อย่างแน่นอนว่านี่ซ้ำซ้อน ถามตัวคุณเองดังนี้: ถ้าทั้งหมด\rและ\nถูกลบออกในสายอักขระทำไมจึงไม่เป็นเช่นนั้นสำหรับคนที่ติดตามกันและกันโดยตรง
Johannes Pille

จริงๆแล้วสิ่งที่ชัดเจนนี้ไม่ได้อยู่ในใจของฉัน ... ขอบคุณ :) ฉันเพิ่งรู้ว่าฉันมีปัญหากับมัน แต่มันเป็นวิธีอื่นที่ฉันใช้\r\nบน Windows และมันไม่ได้ทำงานบน Linux
Ajjaah

ผมใช้ฟังก์ชั่นนี้เพื่อแทนที่การแบ่งบรรทัดด้วยเครื่องหมายจุลภาคดังนั้นที่อยู่เป็นข้อความบรรทัดเดียวดังนั้นการแทนที่\r\nFIRST จะช่วยได้ซึ่งหมายความว่าหนึ่งเครื่องหมายจุลภาคมากกว่าสองสำหรับแต่ละส่วนถ้าการแบ่งบรรทัดนั้น
Martin

@ มาร์ตินใช่คุณถูกฉันเพิ่งรู้เหมือนกันดังนั้นเราจึงแทนที่\r\nก่อนจากนั้นเราแทนที่\rและ\nฉันได้แก้ไขคำตอบของฉัน
Ajjaah

สิ่งนี้ยังคงซ้ำซ้อนหากคุณจะลบทั้งหมด\rและ\rไม่จำเป็นต้องลบ\r\nคุณสามารถstr_replace(array("\r","\n"), "", $buffer);ให้ผู้ใช้ได้รับผลลัพธ์เดียวกัน
stramin

6

str_replace (PHP_EOL, null, $ str);


1
ในขณะนี้อาจตอบคำถามได้แนะนำให้อธิบายเล็กน้อยเกี่ยวกับคำตอบของคุณ
Anirudh Sharma

PHP_EOL ไม่ทำงานเมื่อคุณอ่านสตริง มันเกิดขึ้นเมื่อคุณเขียนมัน
nightfox89

คำตอบที่ใช้รหัสเท่านั้นมีค่าต่ำใน StackOverflow เพราะทำน้อยมากเพื่อให้ความรู้แก่ผู้อ่าน OP และในอนาคต
mickmackusa

4

มีฟังก์ชั่นเพิ่มเติมเล็กน้อย (ใช้งานง่ายได้ทุกที่):

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

การใช้PHP_EOLเป็นพารามิเตอร์การแทนที่การค้นหาก็เป็นแนวคิดที่ดีเช่นกัน! ความรุ่งโรจน์


1

ทางเลือกในตัว: การตัดแต่ง ()

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.

มีไว้เพื่อลบตัวแบ่งบรรทัดจากไฟล์ข้อความประเภทต่าง ๆ แต่ไม่ได้จัดการกับ html


0

ฉันใช้ 3 บรรทัดเพื่อทำงานนี้ดังนั้นให้ลองคิด$ sเป็น "สิ่งของ" ของคุณ ...

$s=str_replace(chr(10),'',$s);
$s=str_replace(chr(13),'',$s);
$s=str_replace("\r\n"),'',$s);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.