Uh, would be nice to check with me before making this patch.. On Sat, 12 Mar 2005, Andrey Hristov wrote: > andrey Sat Mar 12 07:03:51 2005 EDT > > Modified files: > /php-src NEWS > /php-src/ext/pcre php_pcre.c php_pcre.h > /php-src/main SAPI.c > /php-src/win32 sendmail.c > Log: > FR 32275 - fifth parameter to preg_replace() to count number of replaces > made. > #it would be nice if someone of the doc team documents it. thanks! > > > http://cvs.php.net/diff.php/php-src/NEWS?r1=1.1850&r2=1.1851&ty=u > Index: php-src/NEWS > diff -u php-src/NEWS:1.1850 php-src/NEWS:1.1851 > --- php-src/NEWS:1.1850 Tue Mar 8 01:38:58 2005 > +++ php-src/NEWS Sat Mar 12 07:03:48 2005 > @@ -8,6 +8,8 @@ > . ext/mnogosearch (Jani, Derick) > . ext/w32api (Jani, Derick) > . ext/yp (Jani, Derick) > +- Added additional fifth parameter count to preg_replace_callback() and > + preg_replace() to count the number of replacements made. FR #32275. > (Andrey) > - Changed stream_filter_(ap|pre)pend() to return resource. (Sara) > - Changed mysqli_exception and sqlite_exception to use RuntimeException as > base > if SPL extension is present. (Georg, Marcus) > http://cvs.php.net/diff.php/php-src/ext/pcre/php_pcre.c?r1=1.164&r2=1.165&ty=u > Index: php-src/ext/pcre/php_pcre.c > diff -u php-src/ext/pcre/php_pcre.c:1.164 php-src/ext/pcre/php_pcre.c:1.165 > --- php-src/ext/pcre/php_pcre.c:1.164 Fri Dec 24 14:45:54 2004 > +++ php-src/ext/pcre/php_pcre.c Sat Mar 12 07:03:49 2005 > @@ -16,7 +16,7 @@ > +----------------------------------------------------------------------+ > */ > > -/* $Id: php_pcre.c,v 1.164 2004/12/24 19:45:54 tony2001 Exp $ */ > +/* $Id: php_pcre.c,v 1.165 2005/03/12 12:03:49 andrey Exp $ */ > > #ifdef HAVE_CONFIG_H > #include "config.h" > @@ -807,7 +807,7 @@ > PHPAPI char *php_pcre_replace(char *regex, int regex_len, > char *subject, int > subject_len, > zval *replace_val, > int is_callable_replace, > - int *result_len, int > limit TSRMLS_DC) > + int *result_len, int > limit, int *replace_count TSRMLS_DC) > { > pcre *re = NULL; /* Compiled > regular expression */ > pcre_extra *extra = NULL; /* Holds results of > studying */ > @@ -887,9 +887,12 @@ > piece = subject + start_offset; > > if (count > 0 && (limit == -1 || limit > 0)) { > + if (replace_count) { > + ++*replace_count; > + } > /* Set the match location in subject */ > match = subject + offsets[0]; > - > + > new_len = *result_len + offsets[0] - start_offset; /* > part before the match */ > > /* If evaluating, do it and add the return string's > length */ > @@ -1019,7 +1022,7 @@ > > /* {{{ php_replace_in_subject > */ > -static char *php_replace_in_subject(zval *regex, zval *replace, zval > **subject, int *result_len, int limit, zend_bool is_callable_replace > TSRMLS_DC) > +static char *php_replace_in_subject(zval *regex, zval *replace, zval > **subject, int *result_len, int limit, zend_bool is_callable_replace, int > *replace_count TSRMLS_DC) > { > zval **regex_entry, > **replace_entry = NULL, > @@ -1076,7 +1079,8 @@ > > replace_value, > > is_callable_replace, > > result_len, > - > limit TSRMLS_CC)) != NULL) { > + > limit, > + > replace_count TSRMLS_CC)) != NULL) { > efree(subject_value); > subject_value = result; > subject_len = *result_len; > @@ -1094,7 +1098,8 @@ > replace, > > is_callable_replace, > result_len, > - limit > TSRMLS_CC); > + limit, > + replace_count TSRMLS_CC); > return result; > } > } > @@ -1108,17 +1113,20 @@ > **replace, > **subject, > **limit, > - **subject_entry; > + **subject_entry, > + **zcount; > char *result; > int result_len; > int limit_val = -1; > char *string_key; > ulong num_key; > char *callback_name = NULL; > + int replace_count=0; > + int *replace_count_ptr=NULL; > > /* Get function parameters and do error-checking. */ > - if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 4 || > - zend_get_parameters_ex(ZEND_NUM_ARGS(), ®ex, &replace, > &subject, &limit) == FAILURE) { > + if (ZEND_NUM_ARGS() < 3 || ZEND_NUM_ARGS() > 5 || > + zend_get_parameters_ex(ZEND_NUM_ARGS(), ®ex, &replace, > &subject, &limit, &zcount) == FAILURE) { > WRONG_PARAM_COUNT; > } > if (!is_callable_replace && Z_TYPE_PP(replace) == IS_ARRAY && > Z_TYPE_PP(regex) != IS_ARRAY) { > @@ -1147,6 +1155,9 @@ > convert_to_long_ex(limit); > limit_val = Z_LVAL_PP(limit); > } > + if (ZEND_NUM_ARGS() > 4) { > + replace_count_ptr =& replace_count; > + } > > if (Z_TYPE_PP(regex) != IS_ARRAY) > convert_to_string_ex(regex); > @@ -1160,7 +1171,7 @@ > and add the result to the return_value array. */ > while (zend_hash_get_current_data(Z_ARRVAL_PP(subject), (void > **)&subject_entry) == SUCCESS) { > SEPARATE_ZVAL(subject_entry); > - if ((result = php_replace_in_subject(*regex, *replace, > subject_entry, &result_len, limit_val, is_callable_replace TSRMLS_CC)) != > NULL) { > + if ((result = php_replace_in_subject(*regex, *replace, > subject_entry, &result_len, limit_val, is_callable_replace, replace_count_ptr > TSRMLS_CC)) != NULL) { > /* Add to return array */ > > switch(zend_hash_get_current_key(Z_ARRVAL_PP(subject), &string_key, &num_key, > 0)) > { > @@ -1176,16 +1187,20 @@ > > zend_hash_move_forward(Z_ARRVAL_PP(subject)); > } > - } > - else { /* if subject is not an array */ > - if ((result = php_replace_in_subject(*regex, *replace, subject, > &result_len, limit_val, is_callable_replace TSRMLS_CC)) != NULL) { > + } else { /* if subject is not an array */ > + if ((result = php_replace_in_subject(*regex, *replace, subject, > &result_len, limit_val, is_callable_replace, replace_count_ptr TSRMLS_CC)) != > NULL) { > RETVAL_STRINGL(result, result_len, 0); > } > - } > + } > + if (replace_count_ptr) { > + zval_dtor(*zcount); > + ZVAL_LONG(*zcount, replace_count); > + } > + > } > /* }}} */ > > -/* {{{ proto string preg_replace(mixed regex, mixed replace, mixed subject > [, int limit]) > +/* {{{ proto string preg_replace(mixed regex, mixed replace, mixed subject > [, int limit [, count]]) > Perform Perl-style regular expression replacement. */ > PHP_FUNCTION(preg_replace) > { > @@ -1193,7 +1208,7 @@ > } > /* }}} */ > > -/* {{{ proto string preg_replace_callback(mixed regex, mixed callback, mixed > subject [, int limit]) > +/* {{{ proto string preg_replace_callback(mixed regex, mixed callback, mixed > subject [, int limit [, count]]) > Perform Perl-style regular expression replacement using replacement > callback. */ > PHP_FUNCTION(preg_replace_callback) > { > http://cvs.php.net/diff.php/php-src/ext/pcre/php_pcre.h?r1=1.39&r2=1.40&ty=u > Index: php-src/ext/pcre/php_pcre.h > diff -u php-src/ext/pcre/php_pcre.h:1.39 php-src/ext/pcre/php_pcre.h:1.40 > --- php-src/ext/pcre/php_pcre.h:1.39 Sat Jan 31 22:02:47 2004 > +++ php-src/ext/pcre/php_pcre.h Sat Mar 12 07:03:50 2005 > @@ -16,7 +16,7 @@ > +----------------------------------------------------------------------+ > */ > > -/* $Id: php_pcre.h,v 1.39 2004/02/01 03:02:47 moriyoshi Exp $ */ > +/* $Id: php_pcre.h,v 1.40 2005/03/12 12:03:50 andrey Exp $ */ > > #ifndef PHP_PCRE_H > #define PHP_PCRE_H > @@ -41,7 +41,7 @@ > PHP_FUNCTION(preg_quote); > PHP_FUNCTION(preg_grep); > > -PHPAPI char *php_pcre_replace(char *regex, int regex_len, char *subject, > int subject_len, zval *replace_val, int is_callable_replace, int *result_len, > int limit TSRMLS_DC); > +PHPAPI char *php_pcre_replace(char *regex, int regex_len, char *subject, > int subject_len, zval *replace_val, int is_callable_replace, int *result_len, > int limit, int *replace_count TSRMLS_DC); > PHPAPI pcre* pcre_get_compiled_regex(char *regex, pcre_extra **extra, int > *options TSRMLS_DC); > PHPAPI pcre* pcre_get_compiled_regex_ex(char *regex, pcre_extra **extra, int > *preg_options, int *coptions TSRMLS_DC); > > http://cvs.php.net/diff.php/php-src/main/SAPI.c?r1=1.197&r2=1.198&ty=u > Index: php-src/main/SAPI.c > diff -u php-src/main/SAPI.c:1.197 php-src/main/SAPI.c:1.198 > --- php-src/main/SAPI.c:1.197 Sat Mar 5 11:41:13 2005 > +++ php-src/main/SAPI.c Sat Mar 12 07:03:50 2005 > @@ -18,7 +18,7 @@ > +----------------------------------------------------------------------+ > */ > > -/* $Id: SAPI.c,v 1.197 2005/03/05 16:41:13 moriyoshi Exp $ */ > +/* $Id: SAPI.c,v 1.198 2005/03/12 12:03:50 andrey Exp $ */ > > #include <ctype.h> > #include <sys/stat.h> > @@ -637,7 +637,7 @@ > result = > php_pcre_replace("/realm=\"(.*?)\"/i", 16, > > ptr, ptr_len, > > repl_temp, > - > 0, &result_len, -1 TSRMLS_CC); > + > 0, &result_len, -1, NULL TSRMLS_CC); > if(result_len==ptr_len) { > efree(result); > sprintf(Z_STRVAL_P(repl_temp), > "realm=\\1-%ld\\2", myuid); > @@ -645,7 +645,7 @@ > result = > php_pcre_replace("/realm=([^\\s]+)(.*)/i", 21, > > ptr, ptr_len, > > repl_temp, > - > 0, &result_len, -1 TSRMLS_CC); > + > 0, &result_len, -1, NULL TSRMLS_CC); > if(result_len==ptr_len) { > char *lower_temp = > estrdup(ptr); > char conv_temp[32]; > http://cvs.php.net/diff.php/php-src/win32/sendmail.c?r1=1.62&r2=1.63&ty=u > Index: php-src/win32/sendmail.c > diff -u php-src/win32/sendmail.c:1.62 php-src/win32/sendmail.c:1.63 > --- php-src/win32/sendmail.c:1.62 Fri Feb 25 00:57:41 2005 > +++ php-src/win32/sendmail.c Sat Mar 12 07:03:50 2005 > @@ -17,7 +17,7 @@ > * > */ > > -/* $Id: sendmail.c,v 1.62 2005/02/25 05:57:41 hyanantha Exp $ */ > +/* $Id: sendmail.c,v 1.63 2005/03/12 12:03:50 andrey Exp $ */ > > #include "php.h" /*php specific */ > #include <stdio.h> > @@ -182,7 +182,8 @@ > replace, > 0, > &result_len, > - -1 TSRMLS_CC); > + -1, > + NULL TSRMLS_CC); > if (NULL == result) { > FREE_ZVAL(replace); > return NULL; > @@ -195,7 +196,8 @@ > replace, > 0, > &result_len, > - -1 TSRMLS_CC); > + -1, > + NULL TSRMLS_CC); > efree(result); > FREE_ZVAL(replace); > return result2; >
> -- > PHP CVS Mailing List (http://www.php.net/) > To unsubscribe, visit: http://www.php.net/unsub.php - Andrei -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php