MFH: Implemented feature request #34381 (nl2br() should have an option for XHTML/HTML compatible BR element)

This commit is contained in:
Kalle Sommer Nielsen 2008-08-14 02:56:23 +00:00
parent 540326c31f
commit fcf11ba65e
3 changed files with 25 additions and 11 deletions

3
NEWS
View File

@ -12,6 +12,9 @@ PHP NEWS
- Added litespeed SAPI module. (George Wang)
- Added ext/hash support to ext/session's ID generator. (Sara)
- Implemented feature request #34381 (nl2br() should have an option for
XHTML/HTML compatible BR element) (Kalle)
- Fixed a bug causing miscalculations with the "last <weekday> of <n> month"
relative time string. (Derick)

View File

@ -2739,6 +2739,7 @@ ZEND_END_ARG_INFO()
static
ZEND_BEGIN_ARG_INFO(arginfo_nl2br, 0)
ZEND_ARG_INFO(0, str)
ZEND_ARG_INFO(0, is_xhtml)
ZEND_END_ARG_INFO()
static

View File

@ -3887,18 +3887,19 @@ PHP_FUNCTION(hebrevc)
}
/* }}} */
/* {{{ proto string nl2br(string str)
/* {{{ proto string nl2br(string str [, bool is_xhtml])
Converts newlines to HTML line breaks */
PHP_FUNCTION(nl2br)
{
/* in brief this inserts <br /> before matched regexp \n\r?|\r\n? */
char *tmp, *str;
int new_length;
char *end, *target;
int repl_cnt = 0;
int str_len;
/* in brief this inserts <br /> or <br> before matched regexp \n\r?|\r\n? */
char *tmp, *str;
int new_length;
char *end, *target;
int repl_cnt = 0;
int str_len;
zend_bool is_xhtml = 1;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|b", &str, &str_len, &is_xhtml) == FAILURE) {
return;
}
@ -3927,7 +3928,12 @@ PHP_FUNCTION(nl2br)
RETURN_STRINGL(str, str_len, 1);
}
new_length = str_len + repl_cnt * (sizeof("<br />") - 1);
if (is_xhtml) {
new_length = str_len + repl_cnt * (sizeof("<br />") - 1);
} else {
new_length = str_len + repl_cnt * (sizeof("<br>") - 1);
}
tmp = target = emalloc(new_length + 1);
while (str < end) {
@ -3937,8 +3943,12 @@ PHP_FUNCTION(nl2br)
*target++ = '<';
*target++ = 'b';
*target++ = 'r';
*target++ = ' ';
*target++ = '/';
if (is_xhtml) {
*target++ = ' ';
*target++ = '/';
}
*target++ = '>';
if ((*str == '\r' && *(str+1) == '\n') || (*str == '\n' && *(str+1) == '\r')) {