ระเบิดสตริง PHP ตามบรรทัดใหม่


253

ง่ายใช่มั้ย ก็ไม่ได้ผล: -

$skuList = explode('\n\r', $_POST['skuList']);

28
เครื่องหมายคำพูดเดี่ยวหมายความว่า "อย่าแยกสตริงนี้" @ คำตอบของ Select0r อาจเป็นสิ่งที่คุณกำลังมองหา
Ryan Kinal

3
ซ้ำกันเป็นไปได้ของวิธีการลบบรรทัดใหม่และผลตอบแทนจากสตริง php? ซึ่งมีอยู่แล้วเป็นซ้ำเชื่อถือ NewsLines ลบจากสตริงและบางคนอื่น ๆ ใช้ฟังก์ชั่นการค้นหา frigging ก่อนถามคำถามโปรด!
Gordon

1
@ กอร์ดอน: ฮาฉันเห็นสิ่งที่ พ.ต.อ. กระสุนพูดถึงคำถามอื่น ค่อนข้างเศร้าจริง ๆ การเพิ่มคะแนนปิดของฉันแม้ว่า
BoltClock

9
นอกเหนือจากการเสนอราคาเดียวที่ออกโดยผู้อื่นกล่าวถึงคู่ CRLF \r\nไม่ได้เป็นวิธีอื่น ๆ
Powerlord

1
พยายามจำไว้ว่า: \ R etur \ N
l00k

คำตอบ:


410

ปฏิบัติที่ดีที่สุด

ดังที่กล่าวไว้ในความคิดเห็นต่อคำตอบแรกแนวทางปฏิบัติที่ดีที่สุดคือการใช้ PHP คงที่PHP_EOLซึ่งหมายถึง EOL ของระบบปัจจุบัน ( End Of Line )

$skuList = explode(PHP_EOL, $_POST['skuList']);

PHP มีค่าคงที่ที่มีประโยชน์อื่น ๆ อีกมากมายที่คุณสามารถใช้เพื่อทำให้ระบบโค้ดของคุณเป็นอิสระดูลิงค์นี้เพื่อค้นหาค่าคงที่ของไดเรกทอรีที่มีประโยชน์และเป็นระบบ

คำเตือน

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

UPDATE

ความคิดเห็นของ Andreas ทำให้ฉันรู้ว่าวิธีปฏิบัติที่ดีที่สุดที่ฉันนำเสนอในที่นี้ไม่ได้ใช้กับกรณีการใช้งานที่อธิบายไว้: EOL (PHP) ของเซิร์ฟเวอร์ไม่มีส่วนเกี่ยวข้องกับ EOL เบราว์เซอร์ (ระบบปฏิบัติการใด ๆ ) ที่ใช้ แต่นั่นคือเบราว์เซอร์ที่มาจากสตริง

ดังนั้นโปรดใช้วิธีการแก้ปัญหาจาก @Alin_Purcaru ( สามลง ) เพื่อครอบคลุมฐานทั้งหมดของคุณ (และโหวตคำตอบของเขา):

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

5
นี่เป็นคำตอบใหม่ แต่อาจเป็นคำตอบที่ดีที่สุดและถูกต้อง
frazras

มันแปลกที่เป็นวิธีที่ PHP ต้องการให้คุณทำ :) คุณช่วยให้รายละเอียดเพิ่มเติมเกี่ยวกับระบบปฏิบัติการและเวอร์ชั่น PHP ของคุณได้หรืออาจเป็นรหัสบน PasteBin หรือ sth ที่คล้ายกัน?
Larzan

16
คุณไม่สามารถใช้ PHP_EOL ได้เนื่องจากระบบและแหล่งอินพุตไม่มีส่วนเกี่ยวข้องกัน หากผู้ใช้ใส่บรรทัดใหม่ใน Windows และ PHP ทำงานบน Linux ผลลัพธ์อาจไม่สมบูรณ์
barell

1
@ barell นั่นคือสถานการณ์ที่ฉันอธิบายในส่วน 'warning';) คำถามไม่ได้ระบุอย่างชัดเจนว่าเป็นอินพุตเก่าที่เก็บไว้ในฐานข้อมูล โปรดอ่านส่วน 'คำเตือน' แล้วคุณจะเห็นว่าฉันครอบคลุมสถานการณ์นั้น
Larzan

7
คำตอบนี้ผิดสำหรับกรณีการใช้งานนี้ อย่าใช้ค่าคงที่ PHP_EOL ในกรณีนี้เนื่องจากแหล่งอินพุต (เช่นเบราว์เซอร์ของผู้ใช้) ไม่ใช่ระบบของคุณ ใช้โซลูชันที่ดูแลจุดสิ้นสุดของบรรทัดที่แตกต่างกันทั้งหมด (คำตอบจาก Alin Purcaru)
Andreas

241

ครอบคลุมทุกกรณี อย่าวางใจว่าข้อมูลที่คุณป้อนนั้นมาจากระบบ Windows

$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);

หรือ

$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);

21
ซึ่งจะส่งผลในองค์ประกอบมากมายว่างเปล่าถ้า EOL \r\nคือ เพื่อป้องกันไม่ให้ทั้งใช้งาน: preg_split('/\n|\r/', $_POST['skuList'], -1, PREG_SPLIT_NO_EMPTY);(ทราบว่า\r\nจะกลายเป็นที่ไม่จำเป็นเมื่อใช้ธงนั้น) หรือเพียงแค่ใส่\r\n ก่อน\r :preg_split('/\r\n|\n|\r/', $_POST['skuList']);
webbiedave

2
@webbiedave PREG_SPLIT_NO_EMPTY เป็นคนดี แต่มันจะลบบรรทัดว่าง สิ่งนี้อาจจะใช่หรือไม่ก็ได้
jms

รูปแบบนี้จะจับคู่กับตัวอักษรทุกตัวสำหรับฉันเพราะมันจะประสบความสำเร็จแม้ว่าจะไม่มีอะไรปรากฏขึ้น "?" หมายถึง 0 หรือครั้งเดียวดังนั้นจึงเป็นไปได้ที่จะจับคู่แม้ว่า \ r และ \ n จะไม่มีอยู่ คุณพูดว่า "คงที่" แต่ฉันไม่เห็นว่า ฉันใช้ / (\ r | \ n) + / แทน
Rolf

1
@Rolf ดูเหมือนว่าฉันจะรีบแก้ไข แก้ไขให้ถูกต้องแล้ว สิ่งที่คุณควรใช้ขึ้นอยู่กับว่าคุณต้องการเส้นว่างหรือไม่ในผลลัพธ์ ตัวเลือกจากคำตอบของฉันยังส่งคืนบรรทัดว่าง
Alin Purcaru

3
@AlinPurcaru คุณช่วยอธิบายให้ชัดเจนในคำตอบที่ (ทั้งสองอย่างใช่หรือไม่) จะคืนค่าช่องว่างซึ่งจะไม่?
Patrick

150

ลอง"\n\r"(ราคาคู่) "\n"หรือเพียงแค่

หากคุณไม่แน่ใจว่าคุณมี EOL ประเภทใดให้เรียกใช้ str_replace ก่อนการระเบิดโดยแทนที่ "\ n \ r" ด้วย "\ n"


52
เครื่องหมายคำพูดเดี่ยวใน PHP หมายถึง "อย่าแยกสตริงนี้" นั่นหมายความว่าตัวละครในการควบคุมของคุณไม่ได้รับการแยกวิเคราะห์อักขระเหล่านั้นถูกใช้เป็นตัวอักษร (ไม่ใช่ตัวแบ่งบรรทัดและการขึ้นบรรทัดใหม่ แต่ตามตัวอักษร '\ n \ r' จริง) การใช้เครื่องหมายคำพูดคู่หมายถึง "แยกสตริงนี้" ดังนั้นอักขระควบคุมของคุณจะถูกวิเคราะห์คำ +1
Ryan Kinal

17
/n/r? ฉันรู้ว่า OP เขียนว่า แต่\r\n
eol

20
พิจารณา PHP ปลายสายPHP_EOLอย่างต่อเนื่อง:
Daniel W.

สวัสดีทุกคนนี่คือคำตอบที่ถูกต้องอย่างแน่นอน! ฉันสงสัยว่าทำไม @Alin Purcaru ตอบได้ 44 คะแนน .. มันผิด !!! มันไม่ได้ทำงานอย่างถูกต้องเสมอไปแม้ว่ามันจะทำงานได้ดีดังนั้นนี่คือความคิดเห็นของฉันสำหรับทุกคนที่ติดอยู่ในสิ่งเดียวกัน
Rafik Bari

3
เพียงแค่ไม่สนใจ \ r ระบบปฏิบัติการล่าสุดที่จะใช้โดยไม่ต้อง \ n คือ OS9 ( en.wikipedia.org/wiki/Newline#Representations ) ดังนั้นนี้จะให้ผลลัพธ์ที่ดีที่สุด:explode("\n", str_replace("\r", '', $string));
DanielM

15

มีหลายสิ่งที่นี่:

  • คุณต้องใช้เครื่องหมายคำพูดคู่ไม่ใช่เครื่องหมายคำพูดเดี่ยวมิฉะนั้นอักขระ Escape จะไม่ถูก Escape
  • ลำดับปกติ\r\nไม่ใช่\n\rไม่ได้
  • ขึ้นอยู่กับแหล่งที่มาคุณอาจได้รับ\nโดยไม่ต้อง\r(หรือแม้กระทั่งในกรณีที่ผิดปกติอาจเป็นเพียงแค่\r)

ป.ร. ให้ไว้ ณ จุดสุดท้ายคุณอาจพบว่าใช้ทุกสายพันธุ์ที่เป็นไปได้ที่จะทำให้คุณเป็นวิธีที่มีความน่าเชื่อถือมากขึ้นของการแยกข้อมูลมากกว่าpreg_split() explode()แต่อีกวิธีหนึ่งคุณสามารถใช้explode()ด้วย just \nและจากนั้นใช้trim()เพื่อลบ\rอักขระที่ค้างอยู่รอบ ๆ


คำตอบที่ดี รวบรัดครอบคลุมทุกอย่าง ขอบคุณ!
Kosta Kontos

11

ฟังก์ชั่นนี้ php ระเบิดสตริงโดยnewline ข้อควร

ระวัง : บรรทัดใหม่ในWindowsคือ\ r \ nและในLinuxและUnixคือ\ n
ฟังก์ชั่นนี้เปลี่ยนบรรทัดใหม่ทั้งหมดเป็นโหมดลินุกซ์แล้วแยก
ให้ความสนใจว่าบรรทัดว่างจะถูกละเว้น

function splitNewLine($text) {
    $code=preg_replace('/\n$/','',preg_replace('/^\n/','',preg_replace('/[\r\n]+/',"\n",$text)));
    return explode("\n",$code);
}

ตัวอย่าง

$a="\r\n\r\n\n\n\r\rsalam\r\nman khobam\rto chi\n\rche khabar\n\r\n\n\r\r\n\nbashe baba raftam\r\n\r\n\r\n\r\n";
print_r( splitNewLine($a) );

เอาท์พุต

Array
(
    [0] => salam
    [1] => man khobam
    [2] => to chi
    [3] => che khabar
    [4] => bashe baba raftam
)


6

สำหรับบรรทัดใหม่มันเป็นเพียง

$list = explode("\n", $text);

สำหรับการขึ้นบรรทัดใหม่และการขึ้นบรรทัดใหม่ (เช่นเดียวกับในไฟล์ Windows) เป็นไปตามที่คุณโพสต์ skuList ของคุณเป็นพื้นที่ข้อความหรือไม่?


4

วาง\nเครื่องหมายคำพูดคู่:

explode("\n", $_POST['skuList']);

ในเครื่องหมายคำพูดเดี่ยวถ้าฉันไม่เข้าใจผิดนี่จะถือว่าเป็น\และnแยกต่างหาก



3

ไม่สมบูรณ์ แต่ฉันคิดว่ามันต้องปลอดภัยที่สุด เพิ่มnl2br :

$skuList = explode('<br />', nl2br($_POST['skuList']));


1

ง่ายเหมือนที่ปรากฏ

$skuList = explode('\\n', $_POST['skuList']);

คุณเพียงแค่ต้องผ่านข้อความ"\ n" ที่แน่นอนและการเขียน\ nโดยตรงจะถูกใช้เป็น Escape Sequence ดังนั้น"\\"เพื่อผ่านการย้อนกลับอย่างง่ายแล้วใส่"n"


0

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


0

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

คุณ mysql หนีจากสายก่อนหรือไม่ ในกรณีนี้อักขระขึ้นบรรทัดใหม่ไม่ใช่อักขระขึ้นบรรทัดใหม่

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


3
ทำสิ่งใดก็ตามสตริงหลังจากหลบหนี mysql ไม่มีเหตุผล
ของคุณ

0

การลดตัวแบ่งบรรทัดจากการโพสต์จากกล่องข้อความอินพุต?
สิ่งที่ทำงานได้เร็วขึ้นสำหรับฉันคือการคัดลอกวางข้อความใด ๆ หรือ Excel หรือประเภทตาราง HTML หรือชนิดของข้อมูลบรรทัดใหม่และวางลงใน textarea แทน inputextbox: สิ่งนี้ทำให้ linebreaks ไม่เสียหายใน POST

 <textarea  id="txtArea" name="txtArea" rows="40" cols="170"></textarea>
 <br>
 <input type="submit" value="split lines into array" /> 

ในไฟล์ที่ได้รับแบบฟอร์ม:

 $txtArea ='';  
 $txtArea = $_POST['txtArea'];  
 $TA = $_POST['txtArea'];  
 $string = $TA;  
 $array = preg_split ('/$\R?^/m', $string); 
// or any of these: 
// $array = explode(PHP_EOL,$string);  
// $array = explode("\n", $txtArea); 
 echo "<br>A0: ".$array[0];
 echo "<br>A1: ".@$array[1];
 echo "<br>A2: ".@$array[2];

0

วิธีนี้ใช้ได้ผลกับฉันเสมอ:

$uniquepattern="@#$;?:~#abcz"//Any set of characters which you dont expect to be present in user input $_POST['skuList'] better use atleast 32 charecters.
$skuList=explode($uniquepattern,str_replace("\r","",str_replace("\n",$uniquepattern,$_POST['skuList'])));

0

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

ลองสิ่งนี้:

$myString = "Prepare yourself to be caught
You in the hood gettin' shot
We going throw hell of blows
got my whole frame froze";

$myArray = explode(PHP_EOL, $myString);

print_r($myArray);


0

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน ทดสอบใน PHP 5.6 เช่นเดียวกับ PHP 7.0:

    $skuList = str_replace("\\r\\n", "\n", $_POST['skuList']);
    $skuList = str_replace("\\n\\r", "\n", $skuList);

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