summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2014-09-10 17:19:02 +0200
committerNikita Popov <nikic@php.net>2015-01-26 21:00:23 +0100
commitcb9c99ebd075d1d4fae0cbf5df54ca14c4071584 (patch)
tree098a617ca22583a303d067ceaa077e0efe851dcf
parent4d3e4d3bf994739681613f9061d056e10f731b65 (diff)
downloadphp-git-cb9c99ebd075d1d4fae0cbf5df54ca14c4071584.tar.gz
Remove preg_replace /e modifier
-rw-r--r--NEWS3
-rw-r--r--UPGRADING4
-rw-r--r--ext/pcre/php_pcre.c117
-rw-r--r--ext/pcre/tests/002.phpt8
-rw-r--r--ext/pcre/tests/004.phpt9
-rw-r--r--ext/pcre/tests/preg_replace.phpt10
-rw-r--r--tests/lang/bug24403.phpt21
7 files changed, 20 insertions, 152 deletions
diff --git a/NEWS b/NEWS
index 4e29972d98..b1b8b1bd4a 100644
--- a/NEWS
+++ b/NEWS
@@ -85,6 +85,9 @@
. Fixed bug #60509 (pcntl_signal doesn't decrease ref-count of old handler
when setting SIG_DFL). (Julien)
+- PCRE:
+ . Removed support for the /e (PREG_REPLACE_EVAL) modifier. (Nikita)
+
- PDO_mysql:
. Fixed bug #68424 (Add new PDO mysql connection attr to control multi
statements option). (peter dot wolanin at acquia dot com)
diff --git a/UPGRADING b/UPGRADING
index bb37a05d8a..3e454df1c7 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -79,6 +79,10 @@ PHP X.Y UPGRADE NOTES
. gmp_setbit() and gmp_clrbit() now return FALSE for negative indices, making
them consistent with other GMP functions.
+- PCRE:
+ . Removed support for /e (PREG_REPLACE_EVAL) modifier. Use
+ preg_reaplace_callback() instead.
+
- Standard:
. Removed string category support in setlocale(). Use the LC_* constants
instead.
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index 3e5d96eb90..baf9941764 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -986,88 +986,6 @@ static zend_string *preg_do_repl_func(zval *function, char *subject, int *offset
}
/* }}} */
-/* {{{ preg_do_eval
- */
-static zend_string *preg_do_eval(char *eval_str, int eval_str_len, char *subject,
- int *offsets, int count)
-{
- zval retval; /* Return value from evaluation */
- char *eval_str_end, /* End of eval string */
- *match, /* Current match for a backref */
- *walk, /* Used to walk the code string */
- *segment, /* Start of segment to append while walking */
- walk_last; /* Last walked character */
- int match_len; /* Length of the match */
- int backref; /* Current backref */
- zend_string *esc_match; /* Quote-escaped match */
- zend_string *result_str;
- char *compiled_string_description;
- smart_str code = {0};
-
- eval_str_end = eval_str + eval_str_len;
- walk = segment = eval_str;
- walk_last = 0;
-
- while (walk < eval_str_end) {
- /* If found a backreference.. */
- if ('\\' == *walk || '$' == *walk) {
- smart_str_appendl(&code, segment, walk - segment);
- if (walk_last == '\\') {
- code.s->val[code.s->len-1] = *walk++;
- segment = walk;
- walk_last = 0;
- continue;
- }
- segment = walk;
- if (preg_get_backref(&walk, &backref)) {
- if (backref < count) {
- /* Find the corresponding string match and substitute it
- in instead of the backref */
- match = subject + offsets[backref<<1];
- match_len = offsets[(backref<<1)+1] - offsets[backref<<1];
- if (match_len) {
- esc_match = php_addslashes(zend_string_init(match, match_len, 0), 1);
- } else {
- esc_match = zend_string_init(match, match_len, 0);
- }
- } else {
- esc_match = STR_EMPTY_ALLOC();
- }
- smart_str_appendl(&code, esc_match->val, esc_match->len);
-
- segment = walk;
-
- /* Clean up and reassign */
- zend_string_release(esc_match);
- continue;
- }
- }
- walk++;
- walk_last = walk[-1];
- }
- smart_str_appendl(&code, segment, walk - segment);
- smart_str_0(&code);
-
- compiled_string_description = zend_make_compiled_string_description("regexp code");
- /* Run the code */
- if (zend_eval_stringl(code.s->val, code.s->len, &retval, compiled_string_description) == FAILURE) {
- efree(compiled_string_description);
- php_error_docref(NULL,E_ERROR, "Failed evaluating code: %s%s", PHP_EOL, code.s->val);
- /* zend_error() does not return in this case */
- }
- efree(compiled_string_description);
-
- /* Save the return string */
- result_str = zval_get_string(&retval);
-
- /* Clean up */
- zval_dtor(&retval);
- smart_str_free(&code);
-
- return result_str;
-}
-/* }}} */
-
/* {{{ php_pcre_replace
*/
PHPAPI zend_string *php_pcre_replace(zend_string *regex,
@@ -1103,7 +1021,6 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, char *subject,
int alloc_len; /* Actual allocated length */
int match_len; /* Length of the current match */
int backref; /* Backreference number */
- int eval; /* If the replacement string should be eval'ed */
int start_offset; /* Where the new search starts */
int g_notempty=0; /* If the match should not be empty */
int replace_len=0; /* Length of replacement string */
@@ -1117,7 +1034,7 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, char *subject,
int result_len; /* Length of result */
unsigned char *mark = NULL; /* Target for MARK name */
zend_string *result; /* Result of replacement */
- zend_string *eval_result=NULL; /* Result of eval or custom function */
+ zend_string *eval_result=NULL; /* Result of custom function */
ALLOCA_FLAG(use_heap);
if (extra == NULL) {
@@ -1127,22 +1044,16 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, char *subject,
extra->match_limit = (unsigned long)PCRE_G(backtrack_limit);
extra->match_limit_recursion = (unsigned long)PCRE_G(recursion_limit);
- eval = pce->preg_options & PREG_REPLACE_EVAL;
- if (is_callable_replace) {
- if (eval) {
- php_error_docref(NULL, E_WARNING, "Modifier /e cannot be used with replacement callback");
- return NULL;
- }
- } else {
+ if (pce->preg_options & PREG_REPLACE_EVAL) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The /e modifier is no longer supported, use preg_replace_callback instead");
+ return NULL;
+ }
+ if (!is_callable_replace) {
replace = Z_STRVAL_P(replace_val);
replace_len = (int)Z_STRLEN_P(replace_val);
replace_end = replace + replace_len;
}
- if (eval) {
- php_error_docref(NULL, E_DEPRECATED, "The /e modifier is deprecated, use preg_replace_callback instead");
- }
-
/* Calculate the size of the offsets array, and allocate memory for it. */
num_subpats = pce->capture_count + 1;
size_offsets = num_subpats * 3;
@@ -1201,13 +1112,8 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, char *subject,
match = subject + offsets[0];
new_len = result_len + offsets[0] - start_offset; /* part before the match */
-
- /* If evaluating, do it and add the return string's length */
- if (eval) {
- eval_result = preg_do_eval(replace, replace_len, subject,
- offsets, count);
- new_len += (int)eval_result->len;
- } else if (is_callable_replace) {
+
+ if (is_callable_replace) {
/* Use custom function to get replacement string and its length. */
eval_result = preg_do_repl_func(replace_val, subject, offsets, subpat_names, count, mark);
new_len += (int)eval_result->len;
@@ -1243,10 +1149,9 @@ PHPAPI zend_string *php_pcre_replace_impl(pcre_cache_entry *pce, char *subject,
/* copy replacement and backrefs */
walkbuf = result->val + result_len;
-
- /* If evaluating or using custom function, copy result to the buffer
- * and clean up. */
- if (eval || is_callable_replace) {
+
+ /* If using custom function, copy result to the buffer and clean up. */
+ if (is_callable_replace) {
memcpy(walkbuf, eval_result->val, eval_result->len);
result_len += (int)eval_result->len;
if (eval_result) zend_string_release(eval_result);
diff --git a/ext/pcre/tests/002.phpt b/ext/pcre/tests/002.phpt
index fd245633d3..42b63c7d1b 100644
--- a/ext/pcre/tests/002.phpt
+++ b/ext/pcre/tests/002.phpt
@@ -34,9 +34,5 @@ string(12) "a${1b${1c${1"
Warning: preg_replace(): Compilation failed: missing terminating ] for character class at offset 8 in %s002.php on line 11
NULL
-Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in %s on line 12
-
-Parse error: %s in %s002.php(12) : regexp code on line 1
-
-Fatal error: preg_replace(): Failed evaluating code:
-for ($ in %s002.php on line 12
+Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in %s on line 12
+NULL
diff --git a/ext/pcre/tests/004.phpt b/ext/pcre/tests/004.phpt
index 1fae406b16..11361d1b32 100644
--- a/ext/pcre/tests/004.phpt
+++ b/ext/pcre/tests/004.phpt
@@ -12,8 +12,6 @@ var_dump($m);
var_dump(preg_match_all('/zend_parse_parameters(?:_ex\s*\([^,]+,[^,]+|\s*\([^,]+),\s*"([^"]*)"\s*,\s*([^{;]*)/S', 'zend_parse_parameters( 0, "addd|s/", a, b, &c);', $m, PREG_SET_ORDER | PREG_OFFSET_CAPTURE));
var_dump($m);
-var_dump(preg_replace(array('@//.*@S', '@/\*.*\*/@SsUe'), array('', 'preg_replace("/[^\r\n]+/S", "", \'$0\')'), "hello\n//x \n/*\ns\n*/"));
-
var_dump(preg_split('/PHP_(?:NAMED_)?(?:FUNCTION|METHOD)\s*\((\w+(?:,\s*\w+)?)\)/S', "PHP_FUNCTION(s, preg_match)\n{\nlalala", -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE));
?>
--EXPECTF--
@@ -117,13 +115,6 @@ array(1) {
}
}
}
-
-Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in %s on line %d
-string(9) "hello
-
-
-
-"
array(3) {
[0]=>
array(2) {
diff --git a/ext/pcre/tests/preg_replace.phpt b/ext/pcre/tests/preg_replace.phpt
index f7b5f74157..092857c57e 100644
--- a/ext/pcre/tests/preg_replace.phpt
+++ b/ext/pcre/tests/preg_replace.phpt
@@ -8,18 +8,8 @@ var_dump(preg_replace('{{\D+}}', 'ddd', 'abcd'));
var_dump(preg_replace('/(ab)(c)(d)(e)(f)(g)(h)(i)(j)(k)/', 'a${1}2$103', 'zabcdefghijkl'));
-var_dump(preg_replace_callback('//e', '', ''));
-
-var_dump(preg_replace_callback('//e', 'strtolower', ''));
-
?>
--EXPECTF--
string(1) "x"
string(4) "abcd"
string(8) "zaab2k3l"
-
-Warning: preg_replace_callback(): Requires argument 2, '', to be a valid callback in %spreg_replace.php on line 8
-string(0) ""
-
-Warning: preg_replace_callback(): Modifier /e cannot be used with replacement callback in %spreg_replace.php on line 10
-NULL
diff --git a/tests/lang/bug24403.phpt b/tests/lang/bug24403.phpt
deleted file mode 100644
index 8f4934e7b9..0000000000
--- a/tests/lang/bug24403.phpt
+++ /dev/null
@@ -1,21 +0,0 @@
---TEST--
-Bug #24403 (scope doesn't properly propagate into internal functions)
---FILE--
-<?php
-class a
-{
- public $a = array();
-
- function a()
- {
- $output = preg_replace(
- '!\{\s*([a-z0-9_]+)\s*\}!sie',
- "(in_array('\\1',\$this->a) ? '\'.\$p[\'\\1\'].\'' :
-'\'.\$r[\'\\1\'].\'')",
- "{a} b {c}");
- }
-}
-new a();
-?>
---EXPECTF--
-Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in %s on line %d