Запись данных в файл добавляет ^ M в конце строки - PullRequest
2 голосов
/ 26 января 2011

Используя PHP, я записываю содержимое в файл .htaccess, используя fwrite, все это работает правильно, но когда я просматриваю .htaccess в Vim впоследствии, он отображает ^ M в конце каждой добавленной строки,Это, кажется, не вызывает никаких проблем, но я не уверен, что именно происходит, и может ли это быть предотвращено?

это PHP:

    $replaceWith = "#SO redirect_301\n".trim($_POST['redirect_301'])."\n#EO redirect_301";
    $filename = SITE_ROOT.'/public_html/.htaccess';
    $handle = fopen($filename,'r');
    $contents = fread($handle, filesize($filename));
    fclose($handle);
    if (preg_match('/#SO redirect_301(.*?)#EO redirect_301/si', $contents, $regs)){
    $result = $regs[0];
    }
    $newcontents = str_replace($result,$replaceWith,$contents);
    $filename = SITE_ROOT.'/public_html/.htaccess';
    $handle = fopen($filename,'w');
    if (fwrite($handle, $newcontents) === FALSE) {
    }
    fclose($handle);

Когда я проверяюпотом в Vim я увижу что-то вроде этого:

#SO redirect_301
Redirect 301 /from1 http://www.domain.com/to1^M
Redirect 301 /from2 http://www.domain.com/to2^M
Redirect 301 /from3 http://www.domain.com/to3
#EO redirect_301

На сервере работает CentOS, и я работаю локально на Mac

1 Ответ

3 голосов
/ 26 января 2011

Ваши новые строки приходят как \r\n, а не как \n.

Перед записью в файл вы должны заменить неверный ввод:

$input = trim($_POST['redirect_301']);
$input = preg_replace('/\r\n/', "\n", $input);    // DOS style newlines
$input = preg_replace('/\r/', "\n", $input);      // Mac newlines for nostalgia
...