summaryrefslogtreecommitdiff
path: root/ext/pcre
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2016-07-21 15:36:42 +0200
committerStanislav Malyshev <stas@php.net>2016-09-05 00:30:48 -0700
commit39423e425d6caafea3c0b45c2b6ebe4a06a11462 (patch)
tree9edf2e0095d589ca61521ae1af2f734c19ebdbb5 /ext/pcre
parentcee363d6093abb25a3b0a0f448f8928c1f819294 (diff)
downloadphp-git-39423e425d6caafea3c0b45c2b6ebe4a06a11462.tar.gz
Implement #47456: Missing PCRE option 'J'
While it is possible to force the same behavior by setting the internal option (?J), having a dedicated modifier appears to be useful. After all, J is even listed on the "Pattern Modifiers" man page[1], but the description referrs to (?J). [1] <http://php.net/manual/en/reference.pcre.pattern.modifiers.php>
Diffstat (limited to 'ext/pcre')
-rw-r--r--ext/pcre/php_pcre.c1
-rw-r--r--ext/pcre/tests/request47456.phpt101
2 files changed, 102 insertions, 0 deletions
diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c
index ddc5d764f9..21ea01d92c 100644
--- a/ext/pcre/php_pcre.c
+++ b/ext/pcre/php_pcre.c
@@ -396,6 +396,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(char *regex, int regex_le
coptions |= PCRE_UCP;
#endif
break;
+ case 'J': coptions |= PCRE_DUPNAMES; break;
/* Custom preg options */
case 'e': poptions |= PREG_REPLACE_EVAL; break;
diff --git a/ext/pcre/tests/request47456.phpt b/ext/pcre/tests/request47456.phpt
new file mode 100644
index 0000000000..2ba2627c8d
--- /dev/null
+++ b/ext/pcre/tests/request47456.phpt
@@ -0,0 +1,101 @@
+--TEST--
+Request #47456 (Missing PCRE option 'J')
+--DESCRIPTION--
+The J modifier is supposed to be identical to the internal option (?J), so we're
+testing both.
+--FILE--
+<?php
+preg_match_all('/(?J)(?<chr>[ac])(?<num>\d)|(?<chr>[b])/', 'a1bc3', $m, PREG_SET_ORDER);
+var_dump($m);
+
+unset($m);
+preg_match_all('/(?<chr>[ac])(?<num>\d)|(?<chr>[b])/J', 'a1bc3', $m, PREG_SET_ORDER);
+var_dump($m);
+?>
+--EXPECT--
+array(3) {
+ [0]=>
+ array(5) {
+ [0]=>
+ string(2) "a1"
+ ["chr"]=>
+ string(1) "a"
+ [1]=>
+ string(1) "a"
+ ["num"]=>
+ string(1) "1"
+ [2]=>
+ string(1) "1"
+ }
+ [1]=>
+ array(6) {
+ [0]=>
+ string(1) "b"
+ ["chr"]=>
+ string(1) "b"
+ [1]=>
+ string(0) ""
+ ["num"]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(1) "b"
+ }
+ [2]=>
+ array(5) {
+ [0]=>
+ string(2) "c3"
+ ["chr"]=>
+ string(1) "c"
+ [1]=>
+ string(1) "c"
+ ["num"]=>
+ string(1) "3"
+ [2]=>
+ string(1) "3"
+ }
+}
+array(3) {
+ [0]=>
+ array(5) {
+ [0]=>
+ string(2) "a1"
+ ["chr"]=>
+ string(1) "a"
+ [1]=>
+ string(1) "a"
+ ["num"]=>
+ string(1) "1"
+ [2]=>
+ string(1) "1"
+ }
+ [1]=>
+ array(6) {
+ [0]=>
+ string(1) "b"
+ ["chr"]=>
+ string(1) "b"
+ [1]=>
+ string(0) ""
+ ["num"]=>
+ string(0) ""
+ [2]=>
+ string(0) ""
+ [3]=>
+ string(1) "b"
+ }
+ [2]=>
+ array(5) {
+ [0]=>
+ string(2) "c3"
+ ["chr"]=>
+ string(1) "c"
+ [1]=>
+ string(1) "c"
+ ["num"]=>
+ string(1) "3"
+ [2]=>
+ string(1) "3"
+ }
+}