ошибка \ r \ n и \ n в Windows и Linux-сервере - PullRequest
4 голосов
/ 24 апреля 2011

Я использовал функцию разнесения для получения содержимого textarea в массив на основе строки. Когда я запускаю этот код на моем локальном хосте (WAMPserver 2.1), он прекрасно работает с этим кодом:

$arr=explode("\r\n",$getdata);

Когда я загружаю на свой сервер Linux, мне нужно каждый раз менять код выше на:

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

Каким будет постоянное решение для меня. Какой общий код будет работать для меня на обоих серверах?

Спасибо

Ответы [ 5 ]

6 голосов
/ 24 апреля 2011

Насколько я знаю, лучший способ разбить строку на новые строки - это preg_split и \R:

preg_split('~\R~', $str);

\R соответствует любой последовательности новой строки Unicode, то есть не только LF, CR, CRLF, но и более экзотическим, таким как VT, FF, NEL, LS и PS.

Если такое поведение нежелательно (почему?), Вы можете указать параметр BSR_ANYCRLF:

preg_split('~(*BSR_ANYCRLF)\R~', $str);

Это будет соответствовать только "классическим" последовательностям новой строки.

6 голосов
/ 24 апреля 2011

Константа PHP_EOL содержит зависящий от платформы перевод строки, поэтому вы можете попробовать это:

$arr = explode(PHP_EOL, $getdata);

Но еще лучше нормализовать текст, потому что вы никогда не знаете, какую ОС используют ваши посетители.Это один из способов нормализовать использование \ n в качестве перевода строки (но также посмотреть ответ Алекса, поскольку его регулярное выражение будет обрабатывать все типы перевода строки):

$getdata = str_replace("\r\n", "\n", $getdata);
$arr = explode("\n", $getdata);
1 голос
/ 24 апреля 2011

Что ж, лучшим подходом было бы нормализовать ваши входные данные, используя просто \n, например:

$input = preg_replace('~\r[\n]?~', "\n", $input);

Так как:

  • Unix использует \n.
  • Windows использует \r\n.
  • (Старая версия). Mac OS использует \r.

Тем не менее, взорвающаяся \n должнавам лучшие результаты (если вы не нормализуете).

0 голосов
/ 24 апреля 2011

Вы можете использовать preg_split(), что позволит ему работать независимо от:

$arr = preg_split('/\r?\n/', $getdata);
0 голосов
/ 24 апреля 2011

Константа PHP_EOL содержит последовательность символов новой строки операционной системы хоста.

$arr=explode(PHP_EOL,$getdata);
...