ง่ายใช่มั้ย ก็ไม่ได้ผล: -
$skuList = explode('\n\r', $_POST['skuList']);
\r\n
ไม่ได้เป็นวิธีอื่น ๆ
ง่ายใช่มั้ย ก็ไม่ได้ผล: -
$skuList = explode('\n\r', $_POST['skuList']);
\r\n
ไม่ได้เป็นวิธีอื่น ๆ
คำตอบ:
ปฏิบัติที่ดีที่สุด
ดังที่กล่าวไว้ในความคิดเห็นต่อคำตอบแรกแนวทางปฏิบัติที่ดีที่สุดคือการใช้ 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']);
ครอบคลุมทุกกรณี อย่าวางใจว่าข้อมูลที่คุณป้อนนั้นมาจากระบบ Windows
$skuList = preg_split("/\\r\\n|\\r|\\n/", $_POST['skuList']);
หรือ
$skuList = preg_split('/\r\n|\r|\n/', $_POST['skuList']);
\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']);
ลอง"\n\r"
(ราคาคู่) "\n"
หรือเพียงแค่
หากคุณไม่แน่ใจว่าคุณมี EOL ประเภทใดให้เรียกใช้ str_replace ก่อนการระเบิดโดยแทนที่ "\ n \ r" ด้วย "\ n"
/n/r
? ฉันรู้ว่า OP เขียนว่า แต่\r\n
PHP_EOL
อย่างต่อเนื่อง:
explode("\n", str_replace("\r", '', $string));
มีหลายสิ่งที่นี่:
\r\n
ไม่ใช่\n\r
ไม่ได้\n
โดยไม่ต้อง\r
(หรือแม้กระทั่งในกรณีที่ผิดปกติอาจเป็นเพียงแค่\r
)ป.ร. ให้ไว้ ณ จุดสุดท้ายคุณอาจพบว่าใช้ทุกสายพันธุ์ที่เป็นไปได้ที่จะทำให้คุณเป็นวิธีที่มีความน่าเชื่อถือมากขึ้นของการแยกข้อมูลมากกว่าpreg_split()
explode()
แต่อีกวิธีหนึ่งคุณสามารถใช้explode()
ด้วย just \n
และจากนั้นใช้trim()
เพื่อลบ\r
อักขระที่ค้างอยู่รอบ ๆ
ฟังก์ชั่นนี้ 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
)
ลอง
explode(chr(10), $_POST['skuList']);
สำหรับบรรทัดใหม่มันเป็นเพียง
$list = explode("\n", $text);
สำหรับการขึ้นบรรทัดใหม่และการขึ้นบรรทัดใหม่ (เช่นเดียวกับในไฟล์ Windows) เป็นไปตามที่คุณโพสต์ skuList ของคุณเป็นพื้นที่ข้อความหรือไม่?
วาง\n
เครื่องหมายคำพูดคู่:
explode("\n", $_POST['skuList']);
ในเครื่องหมายคำพูดเดี่ยวถ้าฉันไม่เข้าใจผิดนี่จะถือว่าเป็น\
และn
แยกต่างหาก
คุณเคยลองใช้เครื่องหมายคำพูดคู่หรือไม่?
ไม่สมบูรณ์ แต่ฉันคิดว่ามันต้องปลอดภัยที่สุด เพิ่มnl2br :
$skuList = explode('<br />', nl2br($_POST['skuList']));
ง่ายเหมือนที่ปรากฏ
$skuList = explode('\\n', $_POST['skuList']);
คุณเพียงแค่ต้องผ่านข้อความ"\ n" ที่แน่นอนและการเขียน\ nโดยตรงจะถูกใช้เป็น Escape Sequence ดังนั้น"\\"เพื่อผ่านการย้อนกลับอย่างง่ายแล้วใส่"n"
ก่อนอื่นฉันคิดว่ามันเป็นเรื่องปกติ\r\n
ที่สองคือทั้งหมดนั้นไม่เหมือนกันในทุกระบบ ที่จะทำงานบน windows เท่านั้น มันเป็นเรื่องที่น่ารำคาญที่พยายามคิดหาวิธีแทนที่บรรทัดใหม่เนื่องจากระบบต่าง ๆ ปฏิบัติต่อพวกเขาแตกต่างกัน (ดูที่นี่ ) \n
คุณอาจมีโชคดีที่มีเพียง
หากมีคนอื่นลองใช้สิ่งนี้ แต่มันใช้งานไม่ได้นี่เป็นเครื่องเตือนใจว่าคุณอาจทำผายลมสมองแบบเดียวกับฉัน
คุณ mysql หนีจากสายก่อนหรือไม่ ในกรณีนี้อักขระขึ้นบรรทัดใหม่ไม่ใช่อักขระขึ้นบรรทัดใหม่
ฉันไม่ได้ทำอะไรเลยเพื่อหลีกเลี่ยงการแยกวิเคราะห์เพียงแค่ดัดแปลงและขยายโดย '\ n' (แบ็กสแลชจริง ๆ และnแทนอักขระขึ้นบรรทัดใหม่จริง
การลดตัวแบ่งบรรทัดจากการโพสต์จากกล่องข้อความอินพุต?
สิ่งที่ทำงานได้เร็วขึ้นสำหรับฉันคือการคัดลอกวางข้อความใด ๆ หรือ 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];
วิธีนี้ใช้ได้ผลกับฉันเสมอ:
$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'])));
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);
คุณสามารถลองกับ regex:
$skuList = explode('/[\r\n]+/', $_POST['skuList']);
นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน ทดสอบใน 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);