diff --git a/ext/standard/string.c b/ext/standard/string.c
index fb56de4b399..de550c451c8 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -2978,14 +2978,27 @@ PHP_FUNCTION(hebrevc)
PHP_FUNCTION(nl2br)
{
zval **str;
+ char* tmp;
+ int new_length;
if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &str)==FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(str);
-
- php_char_to_str((*str)->value.str.val, (*str)->value.str.len,'\n', "
\n", 7, return_value);
+
+ /* Windows style line-endings */
+ tmp = boyer_str_to_str((*str)->value.str.val, (*str)->value.str.len, "\r\n", 2, "
\r\n", 8, &new_length);
+ if (new_length != (*str)->value.str.len)
+ RETURN_STRINGL (tmp, new_length, 0);
+ efree (tmp);
+ /* Mac style line-endings */
+ tmp = boyer_str_to_str((*str)->value.str.val, (*str)->value.str.len, "\n\r", 2, "
\n\r", 8, &new_length);
+ if (new_length != (*str)->value.str.len)
+ RETURN_STRINGL (tmp, new_length, 0);
+ efree (tmp);
+ /* Unix style line-endings */
+ php_char_to_str((*str)->value.str.val,(*str)->value.str.len, '\n',"
\n", 7, return_value);
}
/* }}} */