Hi, This script:
<? $line = "Use operator m// for matching strings"; $pattern = "m//"; if(preg_match("/$pattern/", $line, $match)) { print $match[0]."\n"; } ?> outputs the following error: <br /> <b>Warning</b>: Unknown modifier '/' in <b>/home/michael/bug.php</b> on line <b>5</b><br /> I thought it should find the match "m//" ... Can you say, why search of the ending delimiter in a pattern cannot be performed in a simple way, as you can see in the attached patch ? Thanks.
--- ext/pcre/php_pcre.c.orig 2004-07-11 19:10:25.000000000 +0300 +++ ext/pcre/php_pcre.c 2004-07-11 20:16:32.000000000 +0300 @@ -180,41 +180,17 @@ delimiter = pp[5]; end_delimiter = delimiter; - if (start_delimiter == end_delimiter) { - /* We need to iterate through the pattern, searching for the ending delimiter, - but skipping the backslashed delimiters. If the ending delimiter is not - found, display a warning. */ - pp = p; - while (*pp != 0) { - if (*pp == '\\' && pp[1] != 0) pp++; - else if (*pp == delimiter) - break; - pp++; - } - if (*pp == 0) { - php_error_docref(NULL TSRMLS_CC,E_WARNING, "No ending delimiter '%c' found", delimiter); - return NULL; - } - } else { - /* We iterate through the pattern, searching for the matching ending - * delimiter. For each matching starting delimiter, we increment nesting - * level, and decrement it for each matching ending delimiter. If we - * reach the end of the pattern without matching, display a warning. - */ - int brackets = 1; /* brackets nesting level */ - pp = p; - while (*pp != 0) { - if (*pp == '\\' && pp[1] != 0) pp++; - else if (*pp == end_delimiter && --brackets <= 0) - break; - else if (*pp == start_delimiter) - brackets++; - pp++; - } - if (*pp == 0) { - php_error_docref(NULL TSRMLS_CC,E_WARNING, "No ending matching delimiter '%c' found", end_delimiter); - return NULL; + /* Search for the ending delimiter iterating from the end of the pattern */ + pp = p + strlen(p) -1; + while (pp >= p) { + if(*pp == end_delimiter) { + break; } + pp--; + } + if (pp < p) { + php_error_docref(NULL TSRMLS_CC,E_WARNING, "No ending delimiter '%c' found", delimiter); + return NULL; } /* Make a copy of the actual pattern. */
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php