Новий рядок підірвати рядок PHP


253

Просте, правда? Ну, це не працює: - \

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

28
Одиничні лапки означають "не розбирати цей рядок". @ Вибір0r відповідь, мабуть, те, що ви шукаєте.
Райан Кінал

3
можливий дублікат того, як видалити нові рядки та повернення з рядка php? який вже був дублікатом Надійно видалити стрічки новин із рядка та деякі інші . Скористайтеся функцією пошуку, що задається, перш ніж задавати питання!
Гордон

1
@ Gordon: Ха, я бачив, що сказав полковник Шрапнель у тому іншому запитанні. Начебто сумно насправді. Додаю, проте, моє близьке голосування.
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 надає безліч інших дуже корисних констант , за допомогою яких можна зробити систему коду незалежною, перейдіть за цим посиланням, щоб знайти корисні та системні незалежні константи каталогів.

Увага

Ці константи роблять вашу сторінку сторінки незалежною, але у вас можуть виникнути проблеми при переході від однієї системи до іншої, коли ви використовуєте константи з даними, що зберігаються в іншій системі. Константи нової системи можуть відрізнятися від попередніх, і збережені дані можуть більше не працювати. Тому повністю проаналізуйте свої дані, перш ніж зберігати їх, щоб видалити будь-які компоненти, що залежать від системи.

ОНОВЛЕННЯ

У коментарі Андреаса я зрозумів, що рішення "Best Practice", яке я тут представляю, не стосується описаного випадку використання: EOL (PHP) сервера не має нічого спільного з EOL, який використовує браузер (будь-яка ОС), але це (браузер), звідки походить рядок.

Тому, будь ласка, використовуйте рішення від @Alin_Purcaru ( три вниз ), щоб охопити всі ваші бази (і підтвердити його відповідь):

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

5
Це нова відповідь, але це, мабуть, найкраща і справедливо прийнята відповідь
frazras

Це дивно, адже це так, як PHP хоче, щоб ви це зробили :) Чи можете ви мені детальніше розповісти про вашу ОС та версію PHP, можливо, фрагмент коду на PasteBin або sth. схожий?
Ларзан

16
Ви не можете використовувати PHP_EOL, оскільки система та джерело входу не мають нічого спільного. Якщо користувач поставив нові рядки в Windows, а PHP працює на Linux, результат може бути порушений.
barell

1
@barell саме таку ситуацію, яку я описую у частині "попередження";) У запитанні прямо не вказано, що це старий вхід, що зберігається в базі даних. Будь ласка, прочитайте частину "попередження", і ви побачите, що я висвітлюю ту ситуацію.
Ларзан

7
Ця відповідь є просто неправильною для цього випадку використання. У цьому випадку не використовуйте константу PHP_EOL, оскільки джерело вводу (наприклад, браузер користувача), безумовно, не є вашою системою. Скористайтеся розв’язком, яке стосується всіх різних закінчень рядків (відповідь від Алін Пуркару).
Андреас

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 приємно, Але НЕ видалить порожні рядки. Це може бути або не бажано.
джм

Цей зразок відповідав би кожній букві для мене, оскільки це призводить до успіху, навіть якщо нічого немає. "?" означає 0 або один раз, тому можливо, що він збігається, навіть якщо \ r і \ n відсутні. Ви кажете "виправлено", але я цього не бачу. Я використовував / (\ r | \ n) + /.
Рольф

1
@Rolf Здається, я зробив редагування поспіхом. Виправлено це зараз. Те, що вам слід використовувати, залежить від того, хочете ви порожні рядки чи ні у висновку. Варіант з моєї відповіді також повертає порожні рядки.
Алін Пуркару

3
@AlinPurcaru Чи можете ви уточнити у відповіді, які (і те, і інше?) Повернуть пробіли, а які ні?
Патрік

150

Спробуйте "\n\r"(подвійні цитати) або просто "\n".

Якщо ви не впевнені, який тип EOL у вас є, запустіть str_replace перед тим, як вибухнути, замінивши "\ n \ r" на "\ n".


52
Одиночні лапки в PHP означають "не розбирати цей рядок". Це означає, що ваші контрольні символи не розбираються, вони приймаються як буквальні (не розрив рядка та повернення каретки, а фактичний, буквальний '\ n \ r'). Використання подвійних лапок означає "розбір цього рядка", і таким чином ваші контрольні символи будуть розібрані. +1
Райан Кінал

17
/n/r? Я знаю, що ОП написала це, але правильний windows eol є\r\n
webbiedave

20
Розглянемо PHP кінець рядка постійної: PHP_EOL.
Даніель В.

Привіт усім, це, безумовно, правильна відповідь! Мені цікаво, чому відповідь @Alin Purcaru отримала 44 голоси .. Це неправильно !!! Це не завжди працює правильно, хоча здається, що це виконує роботу. Тож ось мій коментар для тих, хто зациклювався на одній і тій же справі
Рафік Барі

3
Просто ігноруйте \ r, останньою ОС, яка використовувала його без \ n, була OS9 ( en.wikipedia.org/wiki/Newline#Representations ). Тому це дасть найкращі результати:explode("\n", str_replace("\r", '', $string));
DanielM

15

Тут багато речей:

  • Вам потрібно використовувати подвійні лапки, а не поодинокі лапки, інакше символи, що втекли, не уникнуть.
  • Нормальна послідовність - \r\nні \n\r.
  • Залежно від джерела, ви можете просто отримати \nбез \r(або навіть у незвичайних випадках, можливо, просто \r)

З огляду на останній пункт, можливо, preg_split()використання всіх можливих варіантів дасть вам більш надійний спосіб поділу даних, ніж explode(). Але в якості альтернативи ви можете користуватися explode()просто \n, а потім використовувати, trim()щоб видалити будь-які \rсимволи, які залишаються навколо.


Чудова відповідь. Стислий, охоплює все. Дякую!
Коста Контос

11

ця функція PHP вибухають рядок з допомогою нового рядка

Увага : новий рядок в Windows , є \ г \ п і в Linux і Unix є \ п
це зміна функції все нові рядки в Linux режим потім розділити його.
зверніть увагу, що порожні рядки будуть проігноровані

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 безпосередньо використовується як послідовність втечі. Тож "\\" пропустити просту рису назад і поставити "n"


0

По-перше, я думаю, що зазвичай це \r\n, по-друге, це не однаково у всіх системах. Це буде працювати тільки на вікнах. Це щось набридливо намагатися розібратися, як замінити нові лінії, тому що різні системи трактують їх по-різному (див. Тут ). Можливо, вам пощастить просто \n.


0

Якщо хтось інший спробував це, але це не спрацювало, це нагадування, що ви, можливо, зробили той самий мозок, як я.

У вас мійскл першим уникнув рядок? У цьому випадку символ нового рядка вже не є символом нового рядка.

Я нічого не зробив, щоб уникнути його розбору, просто адаптований та вибухнутий символом '\ n' (буквально зворотний нахил та n, а не власне символ нового рядка).


3
робити будь-які строкові маніпуляції після втечі з mysql абсолютно не має сенсу
Ваше здорове чуття

0

Втрата розривів рядка від публікації з вхідних текстових полів?
Що швидше для мене працює - це скопіювати вставити будь-який текст або тип таблиці таблиці Excel або HTML або новий тип рядка та вставити їх у текстову область замість inputextbox: це залишає недоторканими рядки в 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

Ви можете спробувати його з допомогою регулярного вираження:

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


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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.