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