diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2015-05-23 19:44:42 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2015-05-23 19:44:42 +0200 |
commit | 6f33594978e56625bd1f6eb0f245e87c0126a5e8 (patch) | |
tree | 3e64417ece1ab6ae7caa0514fe2b4d8d9c5f8880 /ext/pcre/php_pcre.c | |
parent | 911366eb5f884413b5b285c270b1dfda34675459 (diff) | |
download | php-git-6f33594978e56625bd1f6eb0f245e87c0126a5e8.tar.gz |
changed preg_*() to yield NULL instead of '' for unset substrings
Diffstat (limited to 'ext/pcre/php_pcre.c')
-rw-r--r-- | ext/pcre/php_pcre.c | 64 |
1 files changed, 48 insertions, 16 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 3420a09988..0fe5afd988 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -540,7 +540,11 @@ static inline void add_offset_pair(zval *result, char *str, int len, int offset, array_init_size(&match_pair, 2); /* Add (match, offset) to the return value */ - ZVAL_STRINGL(&tmp, str, len); + if (offset < 0) { /* unset substring */ + ZVAL_NULL(&tmp); + } else { + ZVAL_STRINGL(&tmp, str, len); + } zend_hash_next_index_insert_new(Z_ARRVAL(match_pair), &tmp); ZVAL_LONG(&tmp, offset); zend_hash_next_index_insert_new(Z_ARRVAL(match_pair), &tmp); @@ -741,8 +745,12 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec } } else { for (i = 0; i < count; i++) { - add_next_index_stringl(&match_sets[i], (char *)stringlist[i], - offsets[(i<<1)+1] - offsets[i<<1]); + if (offsets[i<<1] < 0) { /* unset substring */ + add_next_index_null(&match_sets[i]); + } else { + add_next_index_stringl(&match_sets[i], (char *)stringlist[i], + offsets[(i<<1)+1] - offsets[i<<1]); + } } } /* Add MARK, if available */ @@ -755,11 +763,11 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec /* * If the number of captured subpatterns on this run is * less than the total possible number, pad the result - * arrays with empty strings. + * arrays with NULLs. */ if (count < num_subpats) { for (; i < num_subpats; i++) { - add_next_index_string(&match_sets[i], ""); + add_next_index_null(&match_sets[i]); } } } else { @@ -776,11 +784,19 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec } else { for (i = 0; i < count; i++) { if (subpat_names[i]) { - add_assoc_stringl(&result_set, subpat_names[i], (char *)stringlist[i], + if (offsets[i<<1] < 0) { /* unset substring */ + add_assoc_null(&result_set, subpat_names[i]); + } else { + add_assoc_stringl(&result_set, subpat_names[i], (char *)stringlist[i], + offsets[(i<<1)+1] - offsets[i<<1]); + } + } + if (offsets[i<<1] < 0) { /* unset substring */ + add_next_index_null(&result_set); + } else { + add_next_index_stringl(&result_set, (char *)stringlist[i], offsets[(i<<1)+1] - offsets[i<<1]); } - add_next_index_stringl(&result_set, (char *)stringlist[i], - offsets[(i<<1)+1] - offsets[i<<1]); } } } else { @@ -791,8 +807,12 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec } } else { for (i = 0; i < count; i++) { - add_next_index_stringl(&result_set, (char *)stringlist[i], - offsets[(i<<1)+1] - offsets[i<<1]); + if (offsets[i<<1] < 0) { /* unset substring */ + add_next_index_null(&result_set); + } else { + add_next_index_stringl(&result_set, (char *)stringlist[i], + offsets[(i<<1)+1] - offsets[i<<1]); + } } } } @@ -815,11 +835,19 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec } else { for (i = 0; i < count; i++) { if (subpat_names[i]) { - add_assoc_stringl(subpats, subpat_names[i], (char *)stringlist[i], - offsets[(i<<1)+1] - offsets[i<<1]); + if (offsets[i<<1] < 0) { /* unset substring */ + add_assoc_null(subpats, subpat_names[i]); + } else { + add_assoc_stringl(subpats, subpat_names[i], (char *)stringlist[i], + offsets[(i<<1)+1] - offsets[i<<1]); + } + } + if (offsets[i<<1] < 0) { /* unset substring */ + add_next_index_null(subpats); + } else { + add_next_index_stringl(subpats, (char *)stringlist[i], + offsets[(i<<1)+1] - offsets[i<<1]); } - add_next_index_stringl(subpats, (char *)stringlist[i], - offsets[(i<<1)+1] - offsets[i<<1]); } } } else { @@ -831,8 +859,12 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, int subjec } } else { for (i = 0; i < count; i++) { - add_next_index_stringl(subpats, (char *)stringlist[i], - offsets[(i<<1)+1] - offsets[i<<1]); + if (offsets[i<<1] < 0) { /* unset substring */ + add_next_index_null(subpats); + } else { + add_next_index_stringl(subpats, (char *)stringlist[i], + offsets[(i<<1)+1] - offsets[i<<1]); + } } } } |