}
/* }}} */
+/* {{{ add_offset_pair */
static inline void add_offset_pair(zval *result, char *str, int len, int offset)
{
zval *match_pair;
zend_hash_next_index_insert(Z_ARRVAL_P(result), &match_pair, sizeof(zval *), NULL);
}
+/* }}} */
/* {{{ php_pcre_match
*/
/* {{{ preg_get_backref
*/
-static inline int preg_get_backref(const char *walk, int *backref)
+static int preg_get_backref(char **str, int *backref)
{
- if (*walk && *walk >= '0' && *walk <= '9')
+ register char in_brace = 0;
+ register char *walk = *str;
+
+ if (walk[1] == 0)
+ return 0;
+
+ if (*walk == '$' && walk[1] == '{') {
+ in_brace = 1;
+ walk++;
+ }
+ walk++;
+
+ if (*walk >= '0' && *walk <= '9') {
*backref = *walk - '0';
- else
+ walk++;
+ } else
return 0;
- if (walk[1] && walk[1] >= '0' && walk[1] <= '9')
- *backref = *backref * 10 + walk[1] - '0';
+ if (*walk && *walk >= '0' && *walk <= '9') {
+ *backref = *backref * 10 + *walk - '0';
+ walk++;
+ }
+
+ if (in_brace) {
+ if (*walk == 0 || *walk != '}')
+ return 0;
+ else
+ walk++;
+ }
+ *str = walk;
return 1;
}
/* }}} */
continue;
}
segment = walk;
- if (preg_get_backref(walk+1, &backref)) {
+ if (preg_get_backref(&walk, &backref)) {
if (backref < count) {
/* Find the corresponding string match and substitute it
in instead of the backref */
}
smart_str_appendl(&code, esc_match, esc_match_len);
- /* Adjust the walk pointer */
- walk += (backref > 9 ? 3 : 2);
segment = walk;
/* Clean up and reassign */
walk_last = 0;
continue;
}
- if (preg_get_backref(walk+1, &backref)) {
+ if (preg_get_backref(&walk, &backref)) {
if (backref < count)
new_len += offsets[(backref<<1)+1] - offsets[backref<<1];
- walk += (backref > 9) ? 3 : 2;
continue;
}
}
walk_last = 0;
continue;
}
- if (preg_get_backref(walk+1, &backref)) {
+ if (preg_get_backref(&walk, &backref)) {
if (backref < count) {
match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
memcpy(walkbuf, subject + offsets[backref<<1], match_len);
walkbuf += match_len;
}
- walk += (backref > 9) ? 3 : 2;
continue;
}
}