Проблема замены буквенной строки \ r \ n с переводом строки в PHP - PullRequest
2 голосов
/ 17 августа 2011

У меня есть текстовый файл с буквенной строкой \r\n.Я хочу заменить это фактическим переводом строки (\ n).

Я знаю, что регулярное выражение /\\r\\n/ должно соответствовать ему (я проверял это в Reggy ), но не могузаставить его работать в PHP.

Я пробовал следующие варианты:

preg_replace("/\\\\r\\\\n/", "\n", $line);

preg_replace("/\\\\[r]\\\\[n]/", "\n", $line);

preg_replace("/[\\\\][r][\\\\][n]/", "\n", $line);

preg_replace("/[\\\\]r[\\\\]n/", "\n", $line);

Если я просто попытаюсь заменить обратную косую черту, она будет работать правильно.Как только я добавляю r, он не находит совпадений.

Файл, который я читаю, кодируется как UTF-16.

Редактировать:

Я также уже пробовалиспользуя str_replace().

Теперь я считаю, что проблема здесь заключается в кодировке символов файла.Я попробовал следующее, и оно сработало:

$testString = "\\r\\n";
echo preg_replace("/\\\\r\\\\n/", "\n", $testString);

, но оно не работает на строках, которые я читаю из моего файла.

Ответы [ 4 ]

5 голосов
/ 17 августа 2011

Не тратьте время на поиски регулярных выражений и попробуйте str_replace() вместо:

str_replace('\r\n', "\n", $string);
3 голосов
/ 17 августа 2011

Избавьте себя от попыток выяснить регулярное выражение и выход из двойных кавычек:

$fixed = str_replace('\r\n', "\n", $line);

Для чего это стоит, preg_replace("/\\\\r\\\\n/", "\n", $line); должно быть хорошо. В качестве демонстрации:

var_dump(preg_replace("/\\\\r\\\\n/", "NL", 'Cake is yummy\r\n\r\n'));

Дает: string(17) "Cake is yummyNLNL"

Также в порядке: '/\\\r\\\n/' и '/\\\\r\\\\n/'

Важно - если вышеприведенное не сработает, вы уверены, что буквальный \r\n - это то, что вы пытаетесь сопоставить? ..

2 голосов
/ 18 августа 2011

UTF-16 это проблема.Если вы просто работаете с необработанными байтами, то вы можете использовать полные последовательности для замены:

$out = str_replace("\x00\x5c\x00\x72\x00\x5c\x00\x6e", "\x00\x0a", $in);

Это предполагает UTF-16 с прямым порядком байтов, иначе меняйте местами нулевые байты, чтобы они шли после ненулевых:

$out = str_replace("\x5c\x00\x72\x00\x5c\x00\x6e\x00", "\x0a\x00", $in);

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

1 голос
/ 18 августа 2011
$result = preg_replace('/\\\\r\\\\n/i', '\n', $subject);
...