Разбить строку PHP новой строкой


253

Просто, правда? Ну, это не работает

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

28
Одинарные кавычки означают «не разбирать эту строку». Ответ @ Select0r, вероятно, то, что вы ищете.
Райан Кинал

3
Возможный дубликат, как удалить новые строки и возврат из строки PHP? который уже был дубликатом Надежно удалить новостные строки из строки и некоторые другие . Используйте чертовски функцию поиска, прежде чем задавать вопросы, пожалуйста!
Гордон

1
@ Гордон: Ха, я видел, что сказал полковник Шрапнель в этом другом вопросе. Как-то грустно на самом деле. Добавление моего близкого голосования все же.
BoltClock

9
В дополнение к одиночным кавычкам, упомянутым другими, пары CRLF - \r\nне наоборот.
Powerlord 22.10.10

1
Постарайтесь запомнить это: \ R etur \ N
l00k

Ответы:


410

Лучшая практика

Как упоминалось в комментарии к первому ответу, лучше всего использовать PHP-константу PHP_EOL, которая представляет EOL ( конец строки ) текущей системы .

$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 - это хорошо, НО это удалит пустые строки. Это может или не может быть желательным.
JMS

Этот шаблон будет соответствовать каждой букве для меня, потому что это приводит к успеху, даже если ничего не присутствует. "?" означает 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? Я знаю, что ОП написал, но правильные окна\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 - \ r \ n, а в Linux и Unix - \ n,
эта функция переводит все новые строки в режим 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 напрямую используется в качестве Escape-последовательности. Так что "\\", чтобы пройти простой обратный слеш, а затем поставить "н"


0

Во-первых, я думаю, что обычно \r\n, во-вторых, они не одинаковы во всех системах. Это будет работать только на окнах. Немного раздражает попытка выяснить, как заменить новые строки, потому что разные системы обрабатывают их по-разному (см. Здесь ). Возможно, вам повезет больше всего \n.


0

Если кто-то попробовал это, но это не сработало, это напоминание о том, что вы, возможно, сделали то же самое, что и я.

MySQL сначала избежал строки? В этом случае символ новой строки больше не является символом новой строки.

Я ничего не делал, чтобы избежать его разбора, просто адаптировал и взорвал '\ 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.