'Explode PHP string by new line

Simple, right? Well, this isn't working :-\

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


Solution 1:[1]

Cover all cases. Don't rely that your input is coming from a Windows environment.

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

or

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

Solution 2:[2]

Try "\n\r" (double quotes) or just "\n".

If you're not sure which type of EOL you have, run a str_replace before your explode, replacing "\n\r" with "\n".

Solution 3:[3]

Lots of things here:

  • You need to use double quotes, not single quotes, otherwise the escaped characters won't be escaped.
  • The normal sequence is \r\n, not \n\r.
  • Depending on the source, you may just be getting \n without the \r (or even in unusual cases, possibly just the \r)

Given the last point, you may find preg_split() using all the possible variants will give you a more reliable way of splitting the data than explode(). But alternatively you could use explode() with just \n, and then use trim() to remove any \r characters that are left hanging around.

Solution 4:[4]

this php function explode string by newline

Attention : new line in Windows is \r\n and in Linux and Unix is \n
this function change all new lines to linux mode then split it.
pay attention that empty lines will be ignored

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

example

$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) );

output

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

Solution 5:[5]

try

explode(chr(10), $_POST['skuList']);

Solution 6:[6]

It doesn't matter what your system uses as newlines if the content might be generated outside of the system.

I am amazed after receiving all of these answers, that no one has simply advised the use of the \R escape sequence. There is only one way that I would ever consider implementing this in one of my own projects. \R provides the most succinct and direct approach.

https://www.php.net/manual/en/regexp.reference.escape.php#:~:text=line%20break:%20matches%20\n,%20\r%20and%20\r\n

Code: (Demo)

$text = "one\ntwo\r\nthree\rfour\r\n\nfive";

var_export(preg_split('~\R~', $text));

Output:

array (
  0 => 'one',
  1 => 'two',
  2 => 'three',
  3 => 'four',
  4 => '',
  5 => 'five',
)

Solution 7:[7]

Place the \n in double quotes:

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

In single quotes, if I'm not mistaken, this is treated as \ and n separately.

Solution 8:[8]

For a new line, it's just

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

For a new line and carriage return (as in Windows files), it's as you posted. Is your skuList a text area?

Solution 9:[9]

To preserve line breaks (as blank items in the array):

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

This handles the unusual \n\r as well as the usual \n\r, \n and \r. Note that the solution from @Alin_Purcaru is very similar, but doesn't handle \n\r.

To remove line breaks (no blank items in the array):

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

PHP Tests
These expressions has been tested on the following OS'es: ubuntu-20.04, ubuntu-18.04, windows-2022, windows-2019, windows-2016, macos-11, macos-10.15 and in the following PHP versions: 8.0, 7.4, 7.3, 7.2, 7.1, 7.0

Here is the PHP test class:
https://github.com/rosell-dk/exec-with-fallback/blob/main/tests/LineSplittingTest.php

And a successful CI run on a project that runs those tests:
https://github.com/rosell-dk/exec-with-fallback/actions/runs/1520070091

Javascript demos of the principle
Here are some javascript demos of similar regular expressions (I'm using N and R instead of \n and \r).

Preserve linebreaks demo: https://regexr.com/6ahvl
Remove linebreaks demo: https://regexr.com/6ai0j

PS: There is currently a bug in regexr which causes it to show "Error" when first loaded. Editing the expression makes the error go away

Solution 10:[10]

Have you tried using double quotes?

Solution 11:[11]

Not perfect but I think it must be safest. Add nl2br:

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

Solution 12:[12]

As easy as it seems

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

You just need to pass the exact text "\n" and writing \n directly is being used as an Escape Sequence. So "\\" to pass a simple backward slash and then put "n"

Solution 13:[13]

PHP_EOL is ostensibly used to find the newline character in a cross-platform-compatible way, so it handles DOS/Unix issues.

Try this:

$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);

Solution 14:[14]

First of all, I think it's usually \r\n, second of all, those are not the same on all systems. That will only work on windows. It's kind-of annoying trying to figure out how to replace new lines because different systems treat them differently (see here). You might have better luck with just \n.

Solution 15:[15]

Losing line breaks from posting from input textboxes?
What works faster for me is to copy paste any text or Excel or HTML table type or newline type of data and paste it into a textarea instead of an inputextbox: this keeps the linebreaks intact in the POST.

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

in the form receiving file:

 $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];

Solution 16:[16]

Try this:

explode(PHP_EOF, $lines);

Solution 17:[17]

Here is what worked for me. Tested in PHP 5.6 as well as as 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);

Solution 18:[18]

This method always works for me:

$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'])));