Надежно удалить строки из строки

Ввод строки поступает из textarea, где пользователи должны вводить каждый отдельный элемент в новой строке.

При обработке формы легко взорвать вход textarea в массив отдельных элементов, таких как:

$arr = explode("\n", $textareaInput);

Он отлично работает, но я беспокоюсь о том, что он не работает корректно в разных системах (в настоящее время я могу тестировать только в Windows). Я знаю, что символы новой строки представлены как \r\n или как просто \r на разных платформах. Будет ли приведенная выше строка кода работать корректно в Linux, Solaris, BSD или другой ОС?

Ответ 1

'\ r' сам по себе как терминатор линии - это старое соглашение, которое больше не используется (не с OSX, основанного на Unix).

Ваш explode будет в порядке. Просто trim от "\ r" в каждом результирующем элементе для пользователей Windows.

Ответ 2

Вы можете использовать preg_split, чтобы сделать это.

$arr = preg_split('/[\r\n]+/', $textareaInput);

Он разбивает его на любую комбинацию символов \r или \n. Вы также можете использовать \s для включения любого пробела char.

Edit
Мне пришло в голову, что, хотя предыдущий код работает нормально, он также удаляет пустые строки. Если вы хотите сохранить пустые строки, вы можете попробовать это вместо:

$arr = preg_split('/(\r\n|[\r\n])/', $textareaInput);

В основном он начинается с поиска версии Windows \r\n, и если это не удается, она ищет либо старую версию Mac \r, либо версию Unix \n.

Например:

<?php
$text = "Windows\r\n\r\nMac\r\rUnix\n\nDone!";
$arr = preg_split('/(\r\n|[\r\n])/', $text);
print_r($arr);
?>

Печать

Array
(
    [0] => Windows
    [1] => 
    [2] => Mac
    [3] => 
    [4] => Unix
    [5] => 
    [6] => Done!
)

Ответ 3

$arr = preg_split( "/[\n\r]+/", $textareaInput );

Ответ 4

Вы можете нормализовать ввод:

<?php

$foo = strtr($foo, array(
    "\r\n" => "\n",
    "\r" => "\n",
    "\n" => "\n",
));

?>

В качестве альтернативы вы можете взорваться с регулярными выражениями:

<?php

$foo = preg_split ("/[\r\n]+/", $foo);

?>

Ответ 5

Следующий код должен выполнить задание

<?php
$split = preg_split('/[\r\n]+/', $src);
foreach ($split as $k=>$string) {
    $split[$k] = trim($string);
    if (empty($split[$k]))
    unset($split[$k]);
}
ksort($split);
$join = implode('', $split);
?>

чтобы получить строку с newlinews, полностью лишенную. Он не будет работать корректно с JS: (