Ввод строки поступает из textarea, где пользователи должны вводить каждый отдельный элемент в новой строке.
При обработке формы легко взорвать вход textarea в массив отдельных элементов, например:
$arr = explode("\n", $textareaInput);
Он работает нормально, но меня беспокоит, что он не работает корректно в разных системах (в настоящее время я могу тестировать только в Windows). Я знаю, что символы новой строки представлены как \ r \ n или как просто \ r на разных платформах. Будет ли приведенная выше строка кода работать корректно в Linux, Solaris, BSD или другой ОС?
'\ r' сам по себе, поскольку терминатор линии – это старое соглашение, которое больше не используется (не с OSX, основанного на Unix).
Ваш explode
будет прекрасным. Просто trim
«\ r» в каждом результирующем элементе для пользователей Windows.
Вы можете использовать preg_split
для этого.
$arr = preg_split('/[\r\n]+/', $textareaInput);
Он разбивает его на любую комбинацию символов \r
или \n
. Вы также можете использовать \s
для включения любого символа пробела.
редактировать
Мне пришло в голову, что, хотя предыдущий код работает нормально, он также удаляет пустые строки. Если вы хотите сохранить пустые строки, вы можете попробовать это вместо этого:
$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! )
$arr = preg_split( "/[\n\r]+/", $textareaInput );
Вы можете нормализовать ввод:
<?php $foo = strtr($foo, array( "\r\n" => "\n", "\r" => "\n", "\n" => "\n", )); ?>
Кроме того, вы можете взорваться с регулярными выражениями:
<?php $foo = preg_split ("/[\r\n]+/", $foo); ?>
Следующий код должен выполнять работу
<?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); ?>
с<?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, хотя 🙁