I somehow don't like the idea. Mostly because I fear we introduce some BC change regarding to the ereg* functionality we yet do not forsee which brings us in the end more trouble (i.e. use complaining) then it's really worth.
Just let ereg* functions stay where they are, if people complain because something doesn't work, rather tell them to use the pcre* family. After your patch, how sure can you be that all ereg* pattern will work without any trouble? This would mean testing many use apps out there ... is it worth the work? Also, I haven't seen much maintainance needed in the both the existing regular expression code. I simply don't see a reason to change the inner functionality and risk to introduce BC problems. Also I don't see a reason to "drop the ereg* function in some future point" (I see the point with emulating them, but see above). -1 On Thu, Oct 31, 2002 at 02:47:27PM -0500, Ilia A. wrote : > Currently PHP ships with two regular expression libraries that are both > installed by default, PCRE & regex. The regex library that is responsible for > ereg_* functions is fairly old and offers a very limited functionality > compared to the PCRE library. In most cases the PCRE functions are also much > faster then the old ereg functions. > I would like to propose that we drop the old ereg library and use only > a single regular expression library, PCRE. For BC purposes I've written a > patch (see attached file), which emulates the old ereg_* functions for people > who still rely on those, using PCRE. > > This cleanup would mean we'd only need to maintain one set of regular > expression code, which as far as code goes is pretty complex as well as give > speed-up for people still using ereg. > Perhaps, at some future point this would allow us to drop the ereg_* functions > all together. > > Ilia > Index: pcre/php_pcre.c > =================================================================== > RCS file: /repository/php4/ext/pcre/php_pcre.c,v > retrieving revision 1.130 > diff -u -3 -p -r1.130 php_pcre.c > --- pcre/php_pcre.c 24 Oct 2002 19:06:19 -0000 1.130 > +++ pcre/php_pcre.c 31 Oct 2002 13:57:58 -0000 > @@ -553,6 +553,110 @@ static void php_pcre_match(INTERNAL_FUNC > } > /* }}} */ > > +/* {{{ ereg_to_pcre_convert > +*/ > +static inline zval *ereg_to_pcre_convert(zval **reg_expr, int case_sens) > +{ > + char *p, *pp; > + int extra_len = 3; > + zval *new_reg; > + > + if (case_sens) { > + extra_len++; > + } > + > + MAKE_STD_ZVAL(new_reg); > + > + Z_STRVAL_P(new_reg) = emalloc(Z_STRLEN_PP(reg_expr) * 2 + extra_len + 1); > + Z_TYPE_P(new_reg) = IS_STRING; > + > + pp = Z_STRVAL_PP(reg_expr); > + p = Z_STRVAL_P(new_reg); > + > + *p++ = '/'; > + while (*pp) { > + if (*pp != '/') { > + *p++ = *pp; > + } else { > + *p++ = '\\'; > + *p++ = '/'; > + extra_len++; > + } > + pp++; > + } > + > + *p++ = '/'; > + if (case_sens) { > + *p++ = 'i'; > + } > + *p++ = 's'; > + *p = '\0'; > + > + Z_STRLEN_P(new_reg) = Z_STRLEN_PP(reg_expr) + extra_len; > + > + return new_reg; > +} > +/* }}} */ > + > +/* {{{ php_pcre_ereg_match > +*/ > +static void php_pcre_ereg_match(INTERNAL_FUNCTION_PARAMETERS, int case_sens) > +{ > + zval **old_regex, **m_string, **subpats = NULL; > + zval **args[3]; > + zval *retval, *pcre_func, *new_regx; > + > + int argc = ZEND_NUM_ARGS(); > + > + if ((argc != 2 && argc != 3) || (zend_get_parameters_ex(argc, &old_regex, >&m_string, &subpats) == FAILURE)) { > + WRONG_PARAM_COUNT; > + } > + > + MAKE_STD_ZVAL(pcre_func); > + ZVAL_STRING(pcre_func, "preg_match", 1); > + > + convert_to_string_ex(old_regex); > + > + new_regx = ereg_to_pcre_convert(old_regex, case_sens); > + > + args[0] = &new_regx; > + args[1] = m_string; > + args[2] = subpats; > + > + if (call_user_function_ex(EG(function_table), NULL, pcre_func, &retval, argc, >args, 0, NULL TSRMLS_CC) == SUCCESS) { > + if (Z_LVAL_P(retval)) { > + RETVAL_TRUE; > + } else { > + RETVAL_FALSE; > + } > + } else { > + RETVAL_FALSE; > + } > + > + zval_dtor(new_regx); > + FREE_ZVAL(new_regx); > + zval_dtor(pcre_func); > + FREE_ZVAL(pcre_func); > + FREE_ZVAL(retval); > +} > +/* }}} */ > + > +/* {{{ proto int ereg(string pattern, string string [, array registers]) > + Regular expression match */ > +PHP_FUNCTION(ereg) > +{ > + php_pcre_ereg_match(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); > +} > +/* }}} */ > + > +/* {{{ proto int eregi(string pattern, string string [, array registers]) > + Case-insensitive regular expression match */ > +PHP_FUNCTION(eregi) > +{ > + php_pcre_ereg_match(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); > +} > +/* }}} */ > + > /* {{{ proto int preg_match(string pattern, string subject [, array subpatterns [, >int flags]]) > Perform a Perl-style regular expression match */ > PHP_FUNCTION(preg_match) > @@ -1102,6 +1206,62 @@ static void preg_replace_impl(INTERNAL_F > } > /* }}} */ > > +/* {{{ php_pcre_ereg_replace > +*/ > +static void php_pcre_ereg_replace(INTERNAL_FUNCTION_PARAMETERS, int case_sens) > +{ > + zval **old_regex, **repl, **src_str; > + zval **args[3]; > + zval *retval, *pcre_func, *new_regx; > + > + int argc = ZEND_NUM_ARGS(); > + > + if (argc != 3 || (zend_get_parameters_ex(argc, &old_regex, &repl, &src_str) == >FAILURE)) { > + WRONG_PARAM_COUNT; > + } > + > + MAKE_STD_ZVAL(pcre_func); > + ZVAL_STRING(pcre_func, "preg_replace", 1); > + > + convert_to_string_ex(old_regex); > + > + new_regx = ereg_to_pcre_convert(old_regex, case_sens); > + > + args[0] = &new_regx; > + args[1] = repl; > + args[2] = src_str; > + > + if (call_user_function_ex(EG(function_table), NULL, pcre_func, &retval, argc, >args, 0, NULL TSRMLS_CC) == SUCCESS) { > + RETVAL_STRINGL(Z_STRVAL_P(retval), Z_STRLEN_P(retval), 1); > + } else { > + RETVAL_FALSE; > + } > + > + zval_dtor(new_regx); > + FREE_ZVAL(new_regx); > + zval_dtor(pcre_func); > + FREE_ZVAL(pcre_func); > + zval_dtor(retval); > + FREE_ZVAL(retval); > +} > +/* }}} */ > + > +/* {{{ proto string ereg_replace(string pattern, string replacement, string string) > + Replace regular expression */ > +PHP_FUNCTION(ereg_replace) > +{ > + php_pcre_ereg_replace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); > +} > +/* }}} */ > + > +/* {{{ proto string eregi_replace(string pattern, string replacement, string string) > + Case insensitive replace regular expression */ > +PHP_FUNCTION(eregi_replace) > +{ > + php_pcre_ereg_replace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); > +} > +/* }}} */ > + > /* {{{ proto string preg_replace(mixed regex, mixed replace, mixed subject [, int >limit]) > Perform Perl-style regular expression replacement. */ > PHP_FUNCTION(preg_replace) > @@ -1279,6 +1439,68 @@ PHP_FUNCTION(preg_split) > } > /* }}} */ > > +/* {{{ php_pcre_ereg_split > +*/ > +static void php_pcre_ereg_split(INTERNAL_FUNCTION_PARAMETERS, int case_sens) > +{ > + zval **old_regex, **str, **limit; > + zval **args[3]; > + zval *retval, *pcre_func, *new_regx; > + > + int argc = ZEND_NUM_ARGS(); > + > + if ((argc != 3 && argc !=2) || (zend_get_parameters_ex(argc, &old_regex, &str, >&limit) == FAILURE)) { > + WRONG_PARAM_COUNT; > + } > + > + MAKE_STD_ZVAL(pcre_func); > + ZVAL_STRING(pcre_func, "preg_split", 1); > + > + convert_to_string_ex(old_regex); > + > + new_regx = ereg_to_pcre_convert(old_regex, case_sens); > + > + args[0] = &new_regx; > + args[1] = str; > + args[2] = limit; > + > + if (call_user_function_ex(EG(function_table), NULL, pcre_func, &retval, argc, >args, 0, NULL TSRMLS_CC) == SUCCESS) { > + if (Z_TYPE_P(retval) == IS_ARRAY) { > + *return_value = *retval; > + zval_copy_ctor(return_value); > + } else { > + RETVAL_FALSE; > + } > + } else { > + RETVAL_FALSE; > + } > + > + zval_dtor(new_regx); > + FREE_ZVAL(new_regx); > + zval_dtor(pcre_func); > + FREE_ZVAL(pcre_func); > + zval_dtor(retval); > + FREE_ZVAL(retval); > +} > +/* }}} */ > + > +/* {{{ proto array split(string pattern, string string [, int limit]) > + Split string into array by regular expression */ > +PHP_FUNCTION(split) > +{ > + php_pcre_ereg_split(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); > +} > +/* }}} */ > + > +/* {{{ proto array spliti(string pattern, string string [, int limit]) > + Split string into array by regular expression case-insensitive */ > + > +PHP_FUNCTION(spliti) > +{ > + php_pcre_ereg_split(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); > +} > +/* }}} */ > + > /* {{{ proto string preg_quote(string str, string delim_char) > Quote regular expression characters plus an optional character */ > PHP_FUNCTION(preg_quote) > @@ -1471,6 +1693,14 @@ function_entry pcre_functions[] = { > PHP_FE(preg_split, NULL) > PHP_FE(preg_quote, NULL) > PHP_FE(preg_grep, NULL) > +/* the following are wrappers for old style regular expressions */ > + PHP_FE(ereg, third_arg_force_ref) > + PHP_FE(eregi, third_arg_force_ref) > + PHP_FE(ereg_replace, NULL) > + PHP_FE(eregi_replace, NULL) > + PHP_FE(split, NULL) > + PHP_FE(spliti, NULL) > +/* end of wrappers */ > {NULL, NULL, NULL} > }; > > Index: pcre/php_pcre.h > =================================================================== > RCS file: /repository/php4/ext/pcre/php_pcre.h,v > retrieving revision 1.33 > diff -u -3 -p -r1.33 php_pcre.h > --- pcre/php_pcre.h 13 May 2002 17:28:36 -0000 1.33 > +++ pcre/php_pcre.h 31 Oct 2002 13:57:58 -0000 > @@ -40,6 +40,12 @@ PHP_FUNCTION(preg_replace_callback); > PHP_FUNCTION(preg_split); > PHP_FUNCTION(preg_quote); > PHP_FUNCTION(preg_grep); > +PHP_FUNCTION(ereg); > +PHP_FUNCTION(eregi); > +PHP_FUNCTION(ereg_replace); > +PHP_FUNCTION(eregi_replace); > +PHP_FUNCTION(split); > +PHP_FUNCTION(spliti); > > 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 pcre* pcre_get_compiled_regex(char *regex, pcre_extra **extra, int *options); > Index: standard/basic_functions.c > =================================================================== > RCS file: /repository/php4/ext/standard/basic_functions.c,v > retrieving revision 1.539 > diff -u -3 -p -r1.539 basic_functions.c > --- standard/basic_functions.c 29 Oct 2002 23:35:49 -0000 1.539 > +++ standard/basic_functions.c 31 Oct 2002 13:57:59 -0000 > @@ -591,12 +591,6 @@ function_entry basic_functions[] = { > PHP_FE(is_callable, third_arg_force_ref) > > /* functions from reg.c */ > - PHP_FE(ereg, third_arg_force_ref) > - PHP_FE(ereg_replace, > NULL) > - PHP_FE(eregi, third_arg_force_ref) > - PHP_FE(eregi_replace, > NULL) > - PHP_FE(split, > NULL) > - PHP_FE(spliti, > NULL) > PHP_FALIAS(join, implode, > NULL) > PHP_FE(sql_regcase, > NULL) > > Index: standard/reg.c > =================================================================== > RCS file: /repository/php4/ext/standard/reg.c,v > retrieving revision 1.66 > diff -u -3 -p -r1.66 reg.c > --- standard/reg.c 25 Sep 2002 14:02:34 -0000 1.66 > +++ standard/reg.c 31 Oct 2002 13:57:59 -0000 > @@ -253,21 +253,17 @@ static void php_ereg(INTERNAL_FUNCTION_P > } > /* }}} */ > > -/* {{{ proto int ereg(string pattern, string string [, array registers]) > - Regular expression match */ > +/* > PHP_FUNCTION(ereg) > { > php_ereg(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); > } > -/* }}} */ > > -/* {{{ proto int eregi(string pattern, string string [, array registers]) > - Case-insensitive regular expression match */ > PHP_FUNCTION(eregi) > { > php_ereg(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); > } > -/* }}} */ > +*/ > > /* {{{ php_reg_replace > * this is the meat and potatoes of regex replacement! */ > @@ -483,21 +479,16 @@ static void php_ereg_replace(INTERNAL_FU > } > /* }}} */ > > -/* {{{ proto string ereg_replace(string pattern, string replacement, string string) > - Replace regular expression */ > +/* > PHP_FUNCTION(ereg_replace) > { > php_ereg_replace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); > } > -/* }}} */ > - > -/* {{{ proto string eregi_replace(string pattern, string replacement, string string) > - Case insensitive replace regular expression */ > PHP_FUNCTION(eregi_replace) > { > php_ereg_replace(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); > } > -/* }}} */ > +*/ > > /* {{{ php_split > */ > @@ -592,23 +583,17 @@ static void php_split(INTERNAL_FUNCTION_ > } > /* }}} */ > > -/* {{{ proto array split(string pattern, string string [, int limit]) > - Split string into array by regular expression */ > +/* > PHP_FUNCTION(split) > { > php_split(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0); > } > -/* }}} */ > - > -/* {{{ proto array spliti(string pattern, string string [, int limit]) > - Split string into array by regular expression case-insensitive */ > > PHP_FUNCTION(spliti) > { > php_split(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1); > } > - > -/* }}} */ > +*/ > > /* {{{ proto string sql_regcase(string string) > Make regular expression for case insensitive match */ > > -- > PHP Development Mailing List <http://www.php.net/> > To unsubscribe, visit: http://www.php.net/unsub.php -- GnuPG Key: http://guru.josefine.at/~mfischer/C2272BD0.asc $ grep docref_root php.ini docref_root = "http://landonize.it/?how=url&theme=classic&filter=RichyH&user=imajes&url=http%3A%2F%2Fphp.net%2F/" -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php