ฉันจะใช้ PHP“ PHP_EOL” คงที่เมื่อไหร่?


360

ควรใช้PHP_EOLเมื่อไร?

บางครั้งฉันเห็นสิ่งนี้ในตัวอย่างโค้ดของ PHP สิ่งนี้จัดการกับปัญหาปลายทางของ DOS / Mac / Unix หรือไม่


1
ฉันคิดว่ามีคำแนะนำที่ทำให้เข้าใจผิดมากในคำตอบที่ upvoted ในหน้านี้ หากคุณเรียกใช้สคริปต์บนสองแพลตฟอร์มที่ต่างกันให้เปรียบเทียบผลลัพธ์หรือข้อมูลที่สร้างขึ้น (ไฟล์บันทึกหน้า html บันทึกฐานข้อมูล ฯลฯ ) จากนั้น PHP_EOL จะส่งผลให้เกิดความไม่ตรงกันใน diff ในกรณีส่วนใหญ่นี่ไม่ใช่สิ่งที่คุณต้องการ
donquixote

คำตอบ:


357

ใช่PHP_EOLใช้เพื่อค้นหาอักขระขึ้นบรรทัดใหม่ในวิธีที่เข้ากันได้ข้ามแพลตฟอร์มดังนั้นจึงสามารถจัดการกับปัญหา DOS / Unix ได้

โปรดทราบว่าPHP_EOLแสดงถึงอักขระตัวสุดท้ายสำหรับระบบปัจจุบัน ตัวอย่างเช่นจะไม่พบ endline ของ Windows เมื่อดำเนินการในระบบที่เหมือนยูนิกซ์


9
ควรใช้เป็นอักขระบรรทัดสุดท้ายเมื่อเขียนสคริปต์บรรทัดคำสั่งหรือไม่
Thomas Owens

5
@Andre: คนอื่น ๆ ที่เขียนแอพที่จะติดตั้งใช้งานและปรับใช้โดยผู้อื่นเป็นอย่างไร คุณกำลังแนะนำสิ่งเหล่านี้ควร จำกัด "แพลตฟอร์มที่รองรับ" ให้กับ * nix หรือไม่
Cylindric

1
@ Stann - สิ่งที่ "โครงการใหญ่" ที่คุณรู้เกี่ยวกับการทำคือแทบจะไม่ปัจจัยการตัดสินใจในการปฏิบัติที่ดีที่สุดให้นับประสาสิ่งที่เป็นหรือไม่เป็นประโยชน์ ฉันรักษา "โครงการขนาดใหญ่" ที่มีการใช้งานในโฮสต์หลายแห่งรวมถึงเซิร์ฟเวอร์ windows บางตัว อย่าสันนิษฐานว่า - ค่าคงที่จะไม่ทำร้ายอะไรและเป็นวิธีที่ถูกต้องสมบูรณ์ในการเขียนโค้ดที่เป็นกลาง ความคิดเห็นของคุณในทางตรงกันข้ามนั้นค่อนข้างไร้สาระ
Chris Baker

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

1
แต่ไม่ใช้PHP_EOLสำหรับข้อมูลที่โพสต์จากแบบฟอร์ม
Nabi KAZ

88

จากmain/php.hPHP เวอร์ชัน 7.1.1 และเวอร์ชัน 5.6.30:

#ifdef PHP_WIN32
#   include "tsrm_win32.h"
#   include "win95nt.h"
#   ifdef PHP_EXPORTS
#       define PHPAPI __declspec(dllexport)
#   else
#       define PHPAPI __declspec(dllimport)
#   endif
#   define PHP_DIR_SEPARATOR '\\'
#   define PHP_EOL "\r\n"
#else
#   if defined(__GNUC__) && __GNUC__ >= 4
#       define PHPAPI __attribute__ ((visibility("default")))
#   else
#       define PHPAPI
#   endif
#   define THREAD_LS
#   define PHP_DIR_SEPARATOR '/'
#   define PHP_EOL "\n"
#endif

อย่างที่คุณเห็นPHP_EOLสามารถเป็นได้"\r\n"(บนเซิร์ฟเวอร์ Windows) หรือ"\n"(อย่างอื่น) สำหรับ PHP เวอร์ชันก่อนหน้า 5.4.0RC8 มีค่าที่สามที่เป็นไปได้สำหรับPHP_EOL: "\r"(บนเซิร์ฟเวอร์ MacOSX) มันเป็นความผิดและได้รับการแก้ไขใน 2012-03-01 มีข้อผิดพลาด 61193

ขณะที่คนอื่น ๆ บอกคุณแล้วคุณสามารถใช้PHP_EOLในการใด ๆ ของการส่งออก (ที่ใด ๆค่าเหล่านี้จะถูกต้อง - เช่น HTML, XML, บันทึก ... ) ที่คุณต้องการแบบครบวงจรการขึ้นบรรทัดใหม่ โปรดทราบว่าเป็นเซิร์ฟเวอร์ที่กำหนดค่าไม่ใช่ไคลเอ็นต์ ผู้เยี่ยมชม Windows ของคุณจะได้รับค่าจากเซิร์ฟเวอร์ Unix ของคุณซึ่งไม่สะดวกสำหรับพวกเขาในบางครั้ง

ฉันแค่ต้องการแสดงค่าที่เป็นไปได้ของPHP_EOLการสำรองข้อมูลโดยแหล่ง PHP เนื่องจากยังไม่ได้แสดงที่นี่ ...


3
ว้าว. นักพัฒนา PHP ผิดเกี่ยวกับเรื่องนี้ ในฐานะที่เป็นลิงก์ Wikipedia คุณได้กล่าวถึง Mac OS 9 และก่อนใช้ "\ r" แต่ไม่ใช่ OS X ซึ่งใช้ "\ n" บางคนควรยื่นรายงานข้อผิดพลาด ...
imgx64

27
@ imgx64 ใช่บางที แต่คุณเคยเห็นเซิร์ฟเวอร์ MAC ที่ใช้งานจริงหรือไม่
AlexV

3
@ imgx64 มันได้รับการแก้ไขแล้ว 33 วันหลังจากโพสต์ของคุณ :) ฉันได้อัปเดตคำตอบของฉันเพื่อสะท้อนแหล่งที่มาในปัจจุบัน
AlexV

2
ฉันไม่คิดว่าอาร์กิวเมนต์ที่ใช้ PHP_EOL สำหรับ output (!) นั้นถูกต้อง PHP_EOL ฝั่งเซิร์ฟเวอร์ในขณะที่การส่งออกเป็นปกติสำหรับลูกค้า (ซึ่งใช้ตัวคั่นการสิ้นสุดบรรทัดที่แตกต่างกัน) ตัวอย่าง: หากคุณสร้างเอาต์พุตข้อความแบบหลายบรรทัดบนระบบ linux ด้วย PHP_EOL และส่งไปยังระบบ Windows จะไม่เป็นตัวคั่นสิ้นสุดบรรทัดที่ถูกต้อง - มันจะขึ้นอยู่กับซอฟต์แวร์ไคลเอ็นต์ที่จะแสดงผลลัพธ์ เบราว์เซอร์และเครื่องมือแก้ไขข้อความบางอย่างอาจจัดการได้ แต่ถ้าคุณดูข้อความใน Notepad ทุกอย่างจะอยู่ในบรรทัดเดียว
StanE

php -r "echo addcslashes(PHP_EOL, PHP_EOL), PHP_EOL;"ค้นหา.
Bob Stein

82

คุณใช้PHP_EOLเมื่อคุณต้องการบรรทัดใหม่และคุณต้องการข้ามแพลตฟอร์ม

นี่อาจเป็นเมื่อคุณกำลังเขียนไฟล์ไปยังระบบไฟล์ (บันทึกการส่งออกและอื่น ๆ )

คุณสามารถใช้มันหากคุณต้องการให้ HTML ที่สร้างขึ้นของคุณสามารถอ่านได้ ดังนั้นคุณอาจทำตามที่คุณมี<br />PHP_EOL

คุณจะใช้มันหากคุณใช้ php เป็นสคริปต์จาก cron และคุณต้องการที่จะแสดงผลออกมาและจัดรูปแบบสำหรับหน้าจอ

คุณอาจใช้มันหากคุณสร้างอีเมลเพื่อส่งสิ่งที่จำเป็นต้องมีการจัดรูปแบบ


25
คุณไม่จำเป็นต้องใช้บรรทัดใหม่ที่ไม่ขึ้นกับแพลตฟอร์มเมื่อสร้าง HTML
Rob

6
@ Rob, ถ้าเวอร์ชันเก่าของ IE ให้ตัวดูแหล่งที่มาของหน้าดีขึ้นแล้วแผ่นจดบันทึก windows ฉันอาจเห็นด้วยกับคุณ
Zoredache

14
@Zoredache - HTML จะถูกสร้างขึ้นด้วยบรรทัดใหม่ที่เหมาะสมสำหรับแพลตฟอร์มที่ PHP ทำงานอยู่ซึ่งไม่จำเป็นต้องเหมาะสมกับแพลตฟอร์มที่คุณเข้าใช้งานหน้าเว็บ
Dominic Rodger

2
+1 สำหรับการกล่าวถึงการสร้างอีเมล $header = "From: $from" . PHP_EOL; $header .= "Reply-To: $from" . PHP_EOL; $header .= "Return-Path: $from" . PHP_EOL;
Jakob Cosoroaba

49
PHP_EOLไม่ควรใช้เพื่อแยกส่วนหัวอีเมล ตามคู่มือPHP Mailควรมีการแยกส่วนหัวพิเศษหลายรายการด้วย CRLF (\ r \ n)
Halil Özgür

19

PHP_EOL (สตริง) สัญลักษณ์ 'สิ้นสุดสาย' ที่ถูกต้องสำหรับแพลตฟอร์มนี้ มีให้ตั้งแต่ PHP 4.3.10 และ PHP 5.0.2

คุณสามารถใช้ค่าคงที่นี้เมื่อคุณอ่านหรือเขียนไฟล์ข้อความบนระบบไฟล์ของเซิร์ฟเวอร์

การสิ้นสุดของบรรทัดไม่สำคัญในกรณีส่วนใหญ่เนื่องจากซอฟต์แวร์ส่วนใหญ่สามารถจัดการไฟล์ข้อความได้ไม่ว่าจะมาจากที่ใดก็ตาม คุณควรจะสอดคล้องกับรหัสของคุณ

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

  • ส่วนหัว HTTP จะต้องคั่นด้วย\r\n
  • ไฟล์ CSV ควรใช้\r\nเป็นตัวคั่นแถว

5
แหล่งที่มาของ "ส่วนหัว HTTP ต้องเป็น ... ": ietf.org/rfc/rfc2616.txtบทที่ 4 ส่วนที่ 1
Adrian Föder

2
บรรทัดข้อความSMTP จะต้องยกเลิกโดย\r\n
Bob Stein

12

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

หากการแสดงผลไปยังหน้าเว็บในรูปแบบ HTML โดยเฉพาะอย่างยิ่งในข้อความ<textarea>, <pre>หรือ<code>คุณอาจเคยต้องการที่จะใช้และไม่ได้\nPHP_EOL

เหตุผลก็คือในขณะที่รหัสอาจทำงานได้ดีในเซิร์ฟเวอร์เดียว - ซึ่งเกิดขึ้นเป็นแพลตฟอร์มคล้าย Unix - หากใช้งานบนโฮสต์ Windows (เช่นแพลตฟอร์ม Windows Azure) จากนั้นอาจเปลี่ยนวิธีแสดงหน้าเว็บในเบราว์เซอร์บางตัว (โดยเฉพาะ Internet Explorer - บางเวอร์ชันจะเห็นทั้ง \ n และ \ r)

ฉันไม่แน่ใจว่าปัญหานี้ยังคงเป็นปัญหาอยู่หรือไม่ตั้งแต่ IE6 หรือไม่ดังนั้นจึงอาจเป็นข้อสงสัยที่น่าสงสัย อาจมีกรณีอื่น ๆ (เช่น XHTML ที่เข้มงวด) ซึ่งการแสดงผล suddently \rในบางแพลตฟอร์มอาจทำให้เกิดปัญหากับผลลัพธ์และฉันแน่ใจว่ามีกรณีขอบอื่น ๆ เช่นนั้น

ดังที่มีคนกล่าวไว้แล้วคุณไม่ต้องการใช้เมื่อกลับมาที่ส่วนหัว HTTP เพราะพวกเขาควรติดตาม RFC บนแพลตฟอร์มใด ๆ

ฉันจะไม่ใช้มันเพื่ออะไรอย่างตัวคั่นในไฟล์ CSV (ตามที่มีคนแนะนำ) แพลตฟอร์มที่เซิร์ฟเวอร์กำลังทำงานอยู่ไม่ควรกำหนดจุดสิ้นสุดบรรทัดในไฟล์ที่สร้างขึ้นหรือที่ใช้แล้ว


10

ฉันพบ PHP_EOL มีประโยชน์มากสำหรับการจัดการไฟล์โดยเฉพาะอย่างยิ่งถ้าคุณกำลังเขียนเนื้อหาหลายบรรทัดลงในไฟล์

ตัวอย่างเช่นคุณมีสตริงยาวที่คุณต้องการแบ่งเป็นหลายบรรทัดในขณะที่เขียนเป็นไฟล์ธรรมดา การใช้ \ r \ n อาจใช้งานไม่ได้เพียงแค่ใส่ PHP_EOL ลงในสคริปต์ของคุณและผลลัพธ์ก็ยอดเยี่ยม

ลองดูตัวอย่างง่ายๆด้านล่างนี้:

<?php

$output = 'This is line 1' . PHP_EOL .
          'This is line 2' . PHP_EOL .
          'This is line 3';

$file = "filename.txt";

if (is_writable($file)) {
    // In our example we're opening $file in append mode.
    // The file pointer is at the bottom of the file hence
    // that's where $output will go when we fwrite() it.
    if (!$handle = fopen($file, 'a')) {
         echo "Cannot open file ($file)";
         exit;
    }
    // Write $output to our opened file.
    if (fwrite($handle, $output) === FALSE) {
        echo "Cannot write to file ($file)";
        exit;
    }
    echo "Success, content ($output) wrote to file ($file)";
    fclose($handle);
} else {
    echo "The file $file is not writable";
}
?>

3
\ n \ r จะไม่ทำงานเนื่องจากมีการเรียงลำดับเป็น \ r \ n </pedantry>
frak

10

ไม่ PHP_EOL ไม่สามารถจัดการกับปัญหาปลายสายได้เนื่องจากระบบที่คุณใช้ค่าคงที่นั้นไม่ใช่ระบบเดียวกับที่คุณส่งเอาต์พุตไป

ฉันจะไม่แนะนำให้ใช้ PHP_EOL เลย Unix / Linux ใช้ \ n, MacOS / OS X เปลี่ยนจาก \ r เป็น \ n ด้วยและในหลาย ๆ แอปพลิเคชัน Windows (โดยเฉพาะเบราว์เซอร์) สามารถแสดงผลได้อย่างถูกต้องเช่นกัน บน Windows มันเป็นเรื่องง่ายที่จะเปลี่ยนรหัสฝั่งไคลเอ็นต์ที่มีอยู่เพื่อใช้ \ n เท่านั้นและยังคงรักษาความเข้ากันได้แบบย้อนหลัง: เพียงแค่เปลี่ยนตัวคั่นสำหรับการตัดบรรทัดจาก \ r \ n เป็น \ n และตัดใน trim () เช่นฟังก์ชัน .


3
จะดีที่จะรู้ว่าทำไมคำตอบของฉันคือ downvoted ... บ้า ... คำตอบที่ยอมรับนั้นผิดในขณะที่ของฉันถูกต้อง โดยทั่วไปไม่ถูกต้องที่จะบอกว่า PHP_EOL จัดการกับปัญหา มันสามารถ (และควร) ใช้ถ้าอ่านหรือเขียนบางสิ่งบางอย่างไป / กลับจากระบบเดียวกัน แต่ส่วนใหญ่แล้ว PHP ใช้เพื่อส่งบางสิ่งกลับไปยังไคลเอนต์ (ซึ่งน่าจะเป็นสิ่งที่ผู้ถามคิด) อีกครั้ง: PHP_EOL เป็นค่าคงที่ฝั่งเซิร์ฟเวอร์แท้ มันไม่ได้ (และไม่สามารถ) จัดการกับการแบ่งบรรทัดฝั่งไคลเอ็นต์ได้อย่างถูกต้อง กรุณาเขียนความคิดเห็นและบอกฉันถ้าคุณคิดว่าฉันเขียนอะไรผิด
StanE

3
+1 สำหรับการทำคะแนนที่ดีกับเมล็ด ฉันคิดว่ามันหายไปเพราะเบราว์เซอร์ไม่แสดงช่องว่างใน html ดังนั้นการใช้งานทั่วไปจะเป็นสำหรับแอปพลิเคชันคอนโซล และอย่างที่คุณพูดในกรณีนั้นการสิ้นสุดบรรทัดจะถูกตีความสำหรับสภาพแวดล้อมการทำงานซึ่งเหมาะสมสำหรับแอพคอนโซล แต่ไม่ใช่เว็บแอปพลิเคชันไคลเอนต์เซิร์ฟเวอร์
Jeff Puckett

คำตอบนั้นไม่เกี่ยวข้องกันจริงๆ คุณพูดถึงความเข้ากันได้ของเบราว์เซอร์และส่งไฟล์ไปยังระบบอื่น ขึ้นบรรทัดใหม่มีความเกี่ยวข้องในการแสดงผลข้อความดังนั้นเบราว์เซอร์จึงไม่เกี่ยวข้อง และขัดกับจุดหลักของคุณ, ไฟล์ข้อความเหล่านี้จะมักจะบริโภคในแพลตฟอร์มเดียวที่พวกเขากำลังเขียนเกี่ยวกับ
grantwparks

6

คำจำกัดความของ PHP_EOL คือมันให้อักขระบรรทัดใหม่ของระบบปฏิบัติการที่คุณใช้งานอยู่

ในทางปฏิบัติคุณแทบไม่ควรต้องการสิ่งนี้ พิจารณาบางกรณี:

  • เมื่อคุณแสดงผลไปยังเว็บจะไม่มีการประชุมใด ๆ ยกเว้นว่าคุณควรจะสอดคล้องกัน เนื่องจากเซิร์ฟเวอร์ส่วนใหญ่เป็น Unixy คุณจะต้องใช้ "\ n" ต่อไป

  • หากคุณกำลังส่งออกไปยังไฟล์ PHP_EOL อาจดูเหมือนเป็นความคิดที่ดี อย่างไรก็ตามคุณสามารถรับผลกระทบที่คล้ายกันได้โดยการขึ้นบรรทัดใหม่ตามตัวอักษรในไฟล์ของคุณและสิ่งนี้จะช่วยคุณได้หากคุณพยายามเรียกใช้ไฟล์ที่จัดรูปแบบ CRLF ใน Unix โดยไม่ต้องขึ้นบรรทัดใหม่ที่มีอยู่ ฉันสามารถพูดได้ว่าฉันชอบพฤติกรรมหลัง)

PHP_EOL นั้นยาวมากจนไม่คุ้มที่จะใช้


33
-1 สำหรับ "PHP_EOL นั้นยาวมาก" ไม่ใช่อาร์กิวเมนต์ที่ถูกต้อง
viam0Zah

1
ฉันเห็นด้วยกับคุณ. ไม่มีความรู้สึกใด ๆ ในการปรับใช้ php กับอะไรนอกจาก * ระวัง ดังนั้น - ไม่มีจุดในการใช้ PHP_EOL หรือ DIRECTORY_SEPARATOR
Stann

@ Stann คุณสามารถอธิบายประเด็นของคุณเกี่ยวกับ "ไม่มีเหตุผลใด ๆ ในการปรับใช้ php กับอะไรนอกจาก * ระวัง"?
Sajuuk

2
@Sajuuk ฉันเชื่อว่าจะเรียกว่า "การเสียดสี"
Félix Gagnon-Grenier

3

มีสถานที่หนึ่งที่ชัดเจนซึ่งมันอาจมีประโยชน์คือ: เมื่อคุณเขียนโค้ดที่ส่วนใหญ่ใช้สตริงคำพูดเดี่ยว สามารถพิสูจน์ได้ว่า:

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";

ศิลปะของมันคือการสอดคล้อง ปัญหาเกี่ยวกับการมิกซ์แอนด์แมตช์ '' และ "" คือเมื่อคุณได้รับสตริงที่ยาวคุณไม่ต้องการไปหาคำพูดที่คุณใช้

เช่นเดียวกับทุกสิ่งในชีวิตมันขึ้นอยู่กับบริบท


3

"newline" มาตรฐานของ DOS / Windows คือ CRLF (= \ r \ n) และไม่ใช่ LFCR (\ n \ r) หากเรานำสิ่งเหล่านี้กลับมามีแนวโน้มที่จะสร้างพฤติกรรมที่ไม่คาดคิด (ในความเป็นจริงแล้วเป็นประเภทที่คาดหวัง!: D)

ปัจจุบันโปรแกรมเกือบทั้งหมด (เขียนดี) ยอมรับ LF มาตรฐานของ UNIX สำหรับ \ (\ n) สำหรับโค้ดขึ้นบรรทัดใหม่แม้แต่ mail sender daemons (RFC ตั้ง CRLF เป็นบรรทัดใหม่สำหรับส่วนหัวและเนื้อหาข้อความ)


2

มีประโยชน์กับ error_log () หากคุณกำลังแสดงผลหลายบรรทัด

ฉันได้พบคำสั่ง debug จำนวนมากดูแปลก ๆ บน windows ของฉันติดตั้งเนื่องจากผู้พัฒนาสันนิษฐานว่ายูนิกซ์สิ้นสุดเมื่อเลิกสตริง


2

ฉันใช้ค่าคงที่ PHP_EOL ในสคริปต์บรรทัดคำสั่งที่ฉันต้องเขียน ฉันพัฒนาบนเครื่อง Windows ของฉันในท้องถิ่นแล้วทดสอบบนกล่องเซิร์ฟเวอร์ Linux การใช้ค่าคงที่หมายความว่าฉันไม่ต้องกังวลเกี่ยวกับการใช้บรรทัดที่ถูกต้องสำหรับแต่ละแพลตฟอร์ม


2

ฉันมีเว็บไซต์ที่สคริปต์การบันทึกเขียนบรรทัดใหม่ของข้อความไปยังไฟล์ข้อความหลังจากการกระทำจากผู้ใช้ที่สามารถใช้ระบบปฏิบัติการใด ๆ

การใช้ PHP_EOL ดูเหมือนจะไม่เหมาะสมที่สุดในกรณีนี้ หากผู้ใช้อยู่บน Mac OS และเขียนไปยัง textfile มันจะใส่ \ n เมื่อเปิดไฟล์ข้อความบนคอมพิวเตอร์ที่ใช้ windows จะไม่แสดงตัวแบ่งบรรทัด ด้วยเหตุนี้ฉันจึงใช้ "\ r \ n" แทนซึ่งจะทำงานเมื่อเปิดไฟล์บนระบบปฏิบัติการใด ๆ


1

คุณกำลังเขียนโค้ดที่ใช้สตริงคำพูดเดี่ยว ๆ เป็นส่วนใหญ่

echo 'A $variable_literal that I have'.PHP_EOL.'looks better than'.PHP_EOL;  
echo 'this other $one'."\n";

0

ฉันใช้ WebCalendar และพบว่า Mac iCal barfs ในการนำเข้าไฟล์ ics ที่สร้างขึ้นเนื่องจากจุดสิ้นสุดของบรรทัดถูก hardcoded ใน xcal.php เป็น "\ r \ n" ฉันเข้ามาแทนที่เหตุการณ์ทั้งหมดด้วย PHP_EOL และตอนนี้ iCal มีความสุข! ฉันยังทดสอบใน Vista และ Outlook ก็สามารถนำเข้าไฟล์ได้เช่นกันแม้ว่าตัวอักขระสุดท้ายของบรรทัดคือ "\ n"


<late> นั่นหมายความว่าแอปพลิเคชันของคุณจะทำงานผิดปกติเมื่อติดตั้งบนเซิร์ฟเวอร์ Windows หากคุณต้องการ\nให้ใช้สิ่งนั้นอย่างชัดเจน
duskwuff -inactive-

0

เมื่อ jumi (ปลั๊กอิน Joomla สำหรับ PHP) รวบรวมรหัสของคุณด้วยเหตุผลบางประการมันจะลบแบ็กสแลชทั้งหมดออกจากโค้ดของคุณ เช่นว่าสิ่งที่ชอบ$csv_output .= "\n";จะกลายเป็น$csv_output .= "n";

บั๊กที่น่ารำคาญมาก!

ใช้ PHP_EOL แทนเพื่อให้ได้ผลลัพธ์ตามที่คุณต้องการ


2
ฉันหวังเป็นอย่างยิ่งว่านี่จะเป็นปัญหาการกำหนดค่าที่คุณยังไม่พบ ฉันไม่ได้ใช้ joomla แต่เป็นพฤติกรรมที่น่ากลัวถ้านั่นเป็นวิธีการทำงาน!
jon_darkstar

0

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

<?php
  if (!defined('PHP_EOL')) {
    if (strtoupper(substr(PHP_OS,0,3) == 'WIN')) {
      define('PHP_EOL',"\r\n");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'MAC')) {
      define('PHP_EOL',"\r");
    } elseif (strtoupper(substr(PHP_OS,0,3) == 'DAR')) {
      define('PHP_EOL',"\n");
    } else {
      define('PHP_EOL',"\n");
    }
  }
?>

ดังนั้นคุณสามารถใช้ PHP_EOL ได้โดยไม่มีปัญหา ... เห็นได้ชัดว่าควรใช้ PHP_EOL กับสคริปต์ที่ควรทำงานกับระบบมากขึ้นในครั้งเดียวมิฉะนั้นคุณสามารถใช้ \ n หรือ \ r หรือ \ r \ n ...

หมายเหตุ: PHP_EOL สามารถเป็นได้

1) on Unix    LN    == \n
2) on Mac     CR    == \r
3) on Windows CR+LN == \r\n

หวังว่าคำตอบนี้จะช่วยได้


0

ฉันเพิ่งพบปัญหานี้เมื่อส่งออกไปยังไคลเอนต์ Windows แน่นอนว่า PHP_EOL นั้นสำหรับฝั่งเซิร์ฟเวอร์ แต่เนื้อหาส่วนใหญ่ที่ส่งออกจาก php นั้นสำหรับไคลเอนต์ของ windows ดังนั้นฉันต้องทำการค้นพบของฉันที่นี่สำหรับคนต่อไป

A) echo 'My Text' PHP_EOL; // ไม่ดีเพราะนี่เป็นเพียงผลลัพธ์ \ n และเวอร์ชัน notepad ของ windows ส่วนใหญ่จะแสดงสิ่งนี้ในบรรทัดเดียวและซอฟต์แวร์บัญชี windows ส่วนใหญ่ไม่สามารถนำเข้าอักขระตัวอักษรปลายเส้นประเภทนี้ได้

B) echo 'My Text \ r \ n'; // ไม่ดีเนื่องจากสตริง php ที่ยกมาเดี่ยวไม่ตีความ \ r \ n

C) echo "ข้อความของฉัน \ r \ n"; // Yay มันใช้งานได้! ดูถูกต้องใน notepad และทำงานเมื่อนำเข้าไฟล์ไปยังซอฟต์แวร์ windows อื่น ๆ เช่นบัญชี windows และซอฟต์แวร์การผลิต windows


-2

ฉันชอบที่จะใช้ \ n \ r นอกจากนี้ฉันอยู่บนระบบ windows และ \ n ทำงานได้ดีในประสบการณ์ของฉัน

เนื่องจาก PHP_EOL ไม่ทำงานกับนิพจน์ทั่วไปและนี่เป็นวิธีที่มีประโยชน์ที่สุดในการจัดการกับข้อความดังนั้นฉันจึงไม่เคยใช้มันหรือจำเป็นต้องใช้


12
ระวังด้วยคำสั่งถ่านขึ้นบรรทัดใหม่มันควรจะเป็น \ r \ n (CR + LF): en.wikipedia.org/wiki/Newline
azkotoki

คุณไม่ได้ใช้งาน แต่เว็บไซต์ของคุณสามารถเปิดได้โดยผู้ใดก็ได้บนพีซีเครื่องใดก็ได้ดังนั้นอาจเป็นปัญหา
Owaiz Yusufi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.