From: Andrey Hristov Date: Sat, 29 May 1999 20:04:05 +0000 (+0000) Subject: Fix preg_match_all to do proper matching with \b. X-Git-Tag: BEFORE_REMOVING_GC_STEP1~234 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=70dc46892adbe5e964a1743564f159fe081aff05;p=php Fix preg_match_all to do proper matching with \b. --- diff --git a/ext/pcre/pcre.c b/ext/pcre/pcre.c index a36a2dce2c..043785c82e 100644 --- a/ext/pcre/pcre.c +++ b/ext/pcre/pcre.c @@ -298,7 +298,10 @@ void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) int i; int subpats_order_val; /* Integer value of subpats_order */ const char **stringlist; /* Used to hold list of subpatterns */ - int subject_offset; /* Current position in the subject string */ + char *match, /* The current match */ + *piece, /* The current piece of subject */ + *subject_end; /* Points to the end of the subject */ + /* Get function parameters and do error-checking. */ switch(ARG_COUNT(ht)) { @@ -374,14 +377,16 @@ void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) } /* Start from the beginning of the string */ - subject_offset = 0; + piece = subject->value.str.val; + subject_end = piece + subject->value.str.len; + match = NULL; do { /* Execute the regular expression. */ - count = pcre_exec(re, extra, &subject->value.str.val[subject_offset], - subject->value.str.len-subject_offset, subject->value.str.val, - (subject_offset ? exoptions|PCRE_NOTBOL : exoptions), - offsets, size_offsets, 0); + count = pcre_exec(re, extra, piece, + subject_end-piece, subject->value.str.val, + (piece==subject->value.str.val ? exoptions : exoptions|PCRE_NOTBOL), + offsets, size_offsets, (piece == match)); /* Check for too many substrings condition. */ if (count == 0) { @@ -392,12 +397,12 @@ void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* If something has matched */ if (count >= 0) { matched = 1; + match = piece + offsets[0]; /* If subpatters array has been passed, fill it in with values. */ if (subpats != NULL) { /* Try to get the list of substrings and display a warning if failed. */ - if (pcre_get_substring_list(&subject->value.str.val[subject_offset], - offsets, count, &stringlist) < 0) { + if (pcre_get_substring_list(piece, offsets, count, &stringlist) < 0) { efree(offsets); efree(re); zend_error(E_WARNING, "Get subpatterns list failed"); @@ -437,7 +442,7 @@ void _pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) php_pcre_free(stringlist); /* Advance to the position right after the last full match */ - subject_offset += offsets[1]; + piece += offsets[1]; } } /* If nothing matched */