iliaa Tue May 22 12:37:01 2007 UTC Added files: (Branch: PHP_5_2) /php-src/ext/standard/tests/strings htmlentities18.phpt
Modified files: /php-src NEWS /php-src/ext/standard html.c html.h Log: [DOC] Added a 4th parameter flag to htmlspecialchars() and htmlentities() that makes the function not encode existing html entities. The feature is disabled by default and can be activated by passing FALSE as the 4th param http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.727&r2=1.2027.2.547.2.728&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.727 php-src/NEWS:1.2027.2.547.2.728 --- php-src/NEWS:1.2027.2.547.2.727 Tue May 22 10:22:47 2007 +++ php-src/NEWS Tue May 22 12:37:00 2007 @@ -5,6 +5,8 @@ - Optimized out a couple of per-request syscalls (Rasmus) - Optimized digest generation in md5() and sha1() functions. (Ilia) - Upgraded SQLite 3 to version 3.3.16 (Ilia) +- Added a 4th parameter flag to htmlspecialchars() and htmlentities() that + makes the function not encode existing html entities. (Ilia) - Added PDO::FETCH_KEY_PAIR mode that will fetch a 2 column result set into an associated array. (Ilia) - Added function mysql_set_charset(). Allows connection encoding to be http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.c?r1=1.111.2.2.2.9&r2=1.111.2.2.2.10&diff_format=u Index: php-src/ext/standard/html.c diff -u php-src/ext/standard/html.c:1.111.2.2.2.9 php-src/ext/standard/html.c:1.111.2.2.2.10 --- php-src/ext/standard/html.c:1.111.2.2.2.9 Tue Feb 27 03:28:16 2007 +++ php-src/ext/standard/html.c Tue May 22 12:37:00 2007 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: html.c,v 1.111.2.2.2.9 2007/02/27 03:28:16 iliaa Exp $ */ +/* $Id: html.c,v 1.111.2.2.2.10 2007/05/22 12:37:00 iliaa Exp $ */ /* * HTML entity resources: @@ -1078,12 +1078,15 @@ } /* }}} */ - +PHPAPI char *php_escape_html_entities(unsigned char *old, int oldlen, int *newlen, int all, int quote_style, char *hint_charset TSRMLS_DC) +{ + return php_escape_html_entities_ex(old, oldlen, newlen, all, quote_style, hint_charset, 1 TSRMLS_CC); +} /* {{{ php_escape_html_entities */ -PHPAPI char *php_escape_html_entities(unsigned char *old, int oldlen, int *newlen, int all, int quote_style, char *hint_charset TSRMLS_DC) +PHPAPI char *php_escape_html_entities_ex(unsigned char *old, int oldlen, int *newlen, int all, int quote_style, char *hint_charset, zend_bool double_encode TSRMLS_DC) { int i, j, maxlen, len; char *replaced; @@ -1145,8 +1148,34 @@ int is_basic = 0; if (this_char == '&') { - memcpy(replaced + len, "&", sizeof("&") - 1); - len += sizeof("&") - 1; + if (double_encode) { +encode_amp: + memcpy(replaced + len, "&", sizeof("&") - 1); + len += sizeof("&") - 1; + } else { + char *e = memchr(old + i, ';', len - i); + char *s = old + i + 1; + + if (!e || (e - s) > 10) { /* minor optimization to avoid "entities" over 10 chars in length */ + goto encode_amp; + } else { + if (*s == '#') { /* numeric entities */ + s++; + while (s < e) { + if (!isdigit(*s++)) { + goto encode_amp; + } + } + } else { /* text entities */ + while (s < e) { + if (!isalnum(*s++)) { + goto encode_amp; + } + } + } + replaced[len++] = '&'; + } + } is_basic = 1; } else { for (j = 0; basic_entities[j].charcode != 0; j++) { @@ -1193,12 +1222,13 @@ int len; long quote_style = ENT_COMPAT; char *replaced; + zend_bool double_encode = 1; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|ls", &str, &str_len, "e_style, &hint_charset, &hint_charset_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lsb", &str, &str_len, "e_style, &hint_charset, &hint_charset_len, &double_encode) == FAILURE) { return; } - replaced = php_escape_html_entities(str, str_len, &len, all, quote_style, hint_charset TSRMLS_CC); + replaced = php_escape_html_entities_ex(str, str_len, &len, all, quote_style, hint_charset, double_encode TSRMLS_CC); RETVAL_STRINGL(replaced, len, 0); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/standard/html.h?r1=1.20.2.1.2.2&r2=1.20.2.1.2.3&diff_format=u Index: php-src/ext/standard/html.h diff -u php-src/ext/standard/html.h:1.20.2.1.2.2 php-src/ext/standard/html.h:1.20.2.1.2.3 --- php-src/ext/standard/html.h:1.20.2.1.2.2 Mon Jan 1 09:36:08 2007 +++ php-src/ext/standard/html.h Tue May 22 12:37:00 2007 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: html.h,v 1.20.2.1.2.2 2007/01/01 09:36:08 sebastian Exp $ */ +/* $Id: html.h,v 1.20.2.1.2.3 2007/05/22 12:37:00 iliaa Exp $ */ #ifndef HTML_H #define HTML_H @@ -38,6 +38,7 @@ PHP_FUNCTION(get_html_translation_table); PHPAPI char *php_escape_html_entities(unsigned char *old, int oldlen, int *newlen, int all, int quote_style, char *hint_charset TSRMLS_DC); +PHPAPI char *php_escape_html_entities_ex(unsigned char *old, int oldlen, int *newlen, int all, int quote_style, char *hint_charset, zend_bool double_encode TSRMLS_DC); PHPAPI char *php_unescape_html_entities(unsigned char *old, int oldlen, int *newlen, int all, int quote_style, char *hint_charset TSRMLS_DC); #endif /* HTML_H */ http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/strings/htmlentities18.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/strings/htmlentities18.phpt +++ php-src/ext/standard/tests/strings/htmlentities18.phpt -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php