หลายวิธีในการลบ Newline (\n, \r, \r\n) ออกจาก String
วิธีที่ 1: preg_replace() - ครอบคลุมทุกรูปแบบ (แนะนำ)
$str = "Line 1\nLine 2\r\nLine 3\rLine 4";
// ลบ Newline ทั้งหมด (\n, \r, \r\n)
$result = preg_replace('/\r\n|\r|\n/', '', $str);
// "Line 1Line 2Line 3Line 4"
// หรือแบบสั้น (Regex: \R = any Unicode newline sequence - PHP 7.4+)
$result = preg_replace('/\R/', '', $str);
วิธีที่ 2: str_replace() - เร็วกว่า สำหรับ ASCII
$str = "Line 1\nLine 2\r\nLine 3";
// แทนที่ \n และ \r ด้วย String ว่าง
$result = str_replace(["\n", "\r"], '', $str);
// "Line 1Line 2Line 3"
// ⚠️ \r\n จะกลายเป็น \n แล้วถูกลบอีกครั้ง -> ผลลัพธ์ถูกต้อง แต่ทำงาน 2 รอบ
วิธีที่ 3: strtr() - เร็วที่สุดสำหรับ Character Mapping
$str = "Line 1\nLine 2\rLine 3";
// strtr กับ Array Mapping
$result = strtr($str, ["\n" => '', "\r" => '']);
// "Line 1Line 2Line 3"
// strtr กับ String (3 Arguments) - ไม่รองรับ Multi-char
$result = strtr($str, "\n\r", ''); // ❌ ผิด: แมป n->'', \r->'' แยกกัน
วิธีที่ 4: nl2br() + Strip Tags (ถ้าต้องการ
แทน)
$str = "Line 1\nLine 2";
// แปลง Newline เป็น
$html = nl2br($str); // "Line 1
\nLine 2"
// แล้ว Strip Tags ถ้าต้องการ Plain Text
$plain = strip_tags($html); // "Line 1\nLine 2" (กลับมาอีกครั้ง!)
กรณีเฉพาะ: Windows (\r\n) vs Unix (\n) vs Old Mac (\r)
function normalizeNewlines(string $str): string {
// แปลงทุกอย่างเป็น \n ก่อน
$str = str_replace("\r\n", "\n", $str); // Windows -> Unix
$str = str_replace("\r", "\n", $str); // Old Mac -> Unix
return $str;
}
function removeAllNewlines(string $str): string {
return str_replace("\n", '', normalizeNewlines($str));
}
Benchmark (1MB String, 50% Newlines)
/* ประมาณ:
str_replace(["\n","\r"], ''): 0.008s
strtr($str, ["\n"=>'',"\r"=>'']): 0.006s <-- เร็วที่สุด
preg_replace('/\R/', ''): 0.025s (Regex Overhead)
preg_replace('/\r\n|\r|\n/'): 0.022s
*/
// strtr เร็วที่สุดสำหรับ Character Replacement
สรุป
| ความต้องการ | แนะนำ |
|---|---|
| ลบ Newline ทั้งหมด (เร็วที่สุด) | strtr($str, ["\n" => '', "\r" => '']) |
| ลบ Newline ทั้งหมด (Unicode Safe) | preg_replace('/\R/u', '', $str) |
| Normalize Newlines (\r\n, \r → \n) | str_replace(["\r\n", "\r"], "\n", $str) |
| Newline → <br> (HTML) | nl2br($str) |