Надежно удалить строки из строки
Ввод строки поступает из 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: (