Skip to content

Commit cc4cc52

Browse files
committed
fixes
1 parent c22481c commit cc4cc52

5 files changed

Lines changed: 302 additions & 288 deletions

File tree

.idea/encodings.xml

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

runtime-light/stdlib/string/regex-functions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -709,7 +709,7 @@ Optional<string> f$preg_replace(const string& pattern, const string& replacement
709709
static constexpr std::string_view backreference_replacement = "$$$1";
710710

711711
RegexInfo regex_info{backreference_pattern, {replacement.c_str(), replacement.size()}, backreference_replacement};
712-
bool success{get_compiled_regex_cache(regex_info)};
712+
bool success{compile_regex(regex_info)};
713713
success &= replace_regex(regex_info, std::numeric_limits<uint64_t>::max());
714714
if (!success) [[unlikely]] {
715715
kphp::log::warning("can't replace PHP back references with PCRE2 ones");
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
@ok callback benchmark k2_skip
2+
<?php
3+
4+
var_dump (preg_match_all ('~<.*>~', 'This is <something> <something else> <something further> no more', $v)); var_dump ($v);
5+
var_dump (preg_match_all ('~.*?~', 'This', $v)); var_dump ($v);
6+
var_dump (preg_match_all ('~.*~', 'This', $v)); var_dump ($v);
7+
8+
var_dump (preg_match_all ('~<.*?>~', 'This is <something> <something else> <something further> no more', $v)); var_dump ($v);
9+
10+
var_dump (preg_match_all ('~(\d+|)~', '12|34|567|', $v)); var_dump ($v);
11+
var_dump (preg_match_all ('~(\d+\|)~', '12|34|567|', $v)); var_dump ($v);
12+
var_dump (preg_match_all ('~((\d)+\|)~', '12|34|567|', $v)); var_dump ($v);
13+
var_dump (preg_match_all ('~((\d)+\|)+~', '12|34|567|', $v)); var_dump ($v);
14+
var_dump (preg_match_all ('~((\d+)\|)+~', '12|34|567|', $v)); var_dump ($v);
15+
16+
17+
$html = "<b>bold text</b><a href=howdy.html>click me</a>";
18+
19+
preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/", $html, $matches, PREG_SET_ORDER);
20+
21+
foreach ($matches as $val) {
22+
echo "matched: " . $val[0] . "\n";
23+
echo "part 1: " . $val[1] . "\n";
24+
echo "part 2: " . $val[2] . "\n";
25+
echo "part 3: " . $val[3] . "\n";
26+
echo "part 4: " . $val[4] . "\n\n";
27+
}
28+
29+
preg_match_all("/\(? (\d{3})? \)? (?(1) [\-\s] ) \d{3}-\d{4}/x",
30+
"Call 555-1212 or 1-800-555-1212", $phones);
31+
32+
$str = <<<FOO
33+
a: 1
34+
b: 2
35+
c: 3
36+
FOO;
37+
38+
preg_match_all('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);
39+
40+
print_r($matches);
41+
42+
43+
for ($i = 0; $i < 8000; $i++) {
44+
// foreach (array('((?P<abacaba>1)?(?P<name>[a-c]+):() (?P<digit>\d+)(?P<php_bug>a)?)', '=A=i', "/(a)?/") as $pattern) {
45+
foreach (array('((1)?([a-c]+):() (\d+)(a)?)', '=A=i', "/(a)?/") as $pattern) {
46+
foreach (array($str0, '', "a", "1abAcaba", "dad") as $str) {
47+
preg_match_all ($pattern, $str, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE);
48+
if ($i == 0) {
49+
var_dump ("preg_match_all($pattern, $str, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE)");
50+
var_dump ($matches);
51+
}
52+
53+
preg_match_all ($pattern, $str, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE);
54+
if ($i == 0) {
55+
var_dump ("preg_match_all ($pattern, $str, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)");
56+
var_dump ($matches);
57+
}
58+
59+
preg_match_all ($pattern, $str, $matches, PREG_PATTERN_ORDER);
60+
if ($i == 0) {
61+
var_dump ("preg_match_all ($pattern, $str, PREG_PATTERN_ORDER)");
62+
var_dump ($matches);
63+
}
64+
65+
preg_match_all ($pattern, $str, $matches, PREG_SET_ORDER);
66+
if ($i == 0) {
67+
var_dump ("preg_match_all ($pattern, $str, PREG_SET_ORDER)");
68+
var_dump ($matches);
69+
}
70+
71+
preg_match ($pattern, $str, $matches, PREG_OFFSET_CAPTURE);
72+
if ($i == 0) {
73+
var_dump ("preg_match ($pattern, $str, PREG_OFFSET_CAPTURE)");
74+
var_dump ($matches);
75+
}
76+
77+
preg_match ($pattern, $str, $matches);
78+
if ($i == 0) {
79+
var_dump ("preg_match ($pattern, $str)");
80+
var_dump ($matches);
81+
}
82+
}
83+
}
84+
}
85+
86+
87+
foreach (array(PREG_PATTERN_ORDER, PREG_SET_ORDER) as $flag) {
88+
var_dump(preg_match_all('~
89+
(?P<date>
90+
(?P<year>(\d{2})?\d\d) -
91+
(?P<month>(?:\d\d|[a-zA-Z]{2,3})) -
92+
(?P<day>[0-3]?\d))
93+
~x',
94+
'2006-05-13 e outra data: "12-Aug-37"', $m, $flag));
95+
96+
var_dump($m);
97+
}
98+
99+
100+
var_dump(preg_match_all('/((?:(?:unsigned|struct)\s+)?\w+)(?:\s*(\*+)\s+|\s+(\**))(\w+(?:\[\s*\w*\s*\])?)\s*(?:(=)[^,;]+)?((?:\s*,\s*\**\s*\w+(?:\[\s*\w*\s*\])?\s*(?:=[^,;]+)?)*)\s*;/', 'unsigned int xpto = 124; short a, b;', $m, PREG_SET_ORDER));
101+
var_dump($m);
102+
103+
var_dump(preg_match_all('/(?:\([^)]+\))?(&?)([\w>.()-]+(?:\[\w+\])?)\s*,?((?:\)*\s*=)?)/', '&a, b, &c', $m, PREG_SET_ORDER));
104+
var_dump($m);
105+
106+
var_dump(preg_match_all('/zend_parse_parameters(?:_ex\s*\([^,]+,[^,]+|\s*\([^,]+),\s*"([^"]*)"\s*,\s*([^{;]*)/', 'zend_parse_parameters( 0, "addd|s/", a, b, &c);', $m, PREG_SET_ORDER | PREG_OFFSET_CAPTURE));
107+
var_dump($m);
108+
109+
110+
$sampledata = "
111+
/p2/var/php_gcov/PHP_4_4/ext/ming/ming.c: In function `zif_swfbitmap_init':
112+
/p2/var/php_gcov/PHP_4_4/ext/ming/ming.c:323: warning: assignment from incompatible pointer type
113+
/p2/var/php_gcov/PHP_4_4/ext/ming/ming.c: In function `zif_swftextfield_setFont':
114+
/p2/var/php_gcov/PHP_4_4/ext/ming/ming.c:2597: warning: passing arg 2 of `SWFTextField_setFont' from incompatible pointer type
115+
/p2/var/php_gcov/PHP_4_4/ext/oci8/oci8.c:1027: warning: `oci_ping' defined but not used
116+
/p2/var/php_gcov/PHP_4_4/ext/posix/posix.c: In function `zif_posix_getpgid':
117+
/p2/var/php_gcov/PHP_4_4/ext/posix/posix.c:484: warning: implicit declaration of function `getpgid'
118+
/p2/var/php_gcov/PHP_4_4/ext/posix/posix.c: In function `zif_posix_getsid':
119+
/p2/var/php_gcov/PHP_4_4/ext/posix/posix.c:506: warning: implicit declaration of function `getsid'
120+
/p2/var/php_gcov/PHP_4_4/ext/session/mod_files.c: In function `ps_read_files':
121+
/p2/var/php_gcov/PHP_4_4/ext/session/mod_files.c:302: warning: implicit declaration of function `pread'
122+
/p2/var/php_gcov/PHP_4_4/ext/session/mod_files.c: In function `ps_write_files':
123+
/p2/var/php_gcov/PHP_4_4/ext/session/mod_files.c:340: warning: implicit declaration of function `pwrite'
124+
/p2/var/php_gcov/PHP_4_4/ext/sockets/sockets.c: In function `zif_socket_get_option':
125+
/p2/var/php_gcov/PHP_4_4/ext/sockets/sockets.c:1862: warning: unused variable `timeout'
126+
/p2/var/php_gcov/PHP_4_4/ext/sockets/sockets.c: In function `zif_socket_set_option':
127+
/p2/var/php_gcov/PHP_4_4/ext/sockets/sockets.c:1941: warning: unused variable `timeout'
128+
/p2/var/php_gcov/PHP_4_4/regex/regexec.c:19: warning: `nope' defined but not used
129+
/p2/var/php_gcov/PHP_4_4/ext/standard/exec.c:50: warning: `php_make_safe_mode_command' defined but not used
130+
/p2/var/php_gcov/PHP_4_4/ext/standard/image.c: In function `php_handle_jpc':
131+
/p2/var/php_gcov/PHP_4_4/ext/standard/image.c:604: warning: unused variable `dummy_int'
132+
/p2/var/php_gcov/PHP_4_4/ext/standard/parsedate.c: In function `php_gd_parse':
133+
/p2/var/php_gcov/PHP_4_4/ext/standard/parsedate.c:1138: warning: implicit declaration of function `php_gd_lex'
134+
/p2/var/php_gcov/PHP_4_4/ext/standard/parsedate.y: At top level:
135+
/p2/var/php_gcov/PHP_4_4/ext/standard/parsedate.y:864: warning: return type defaults to `int'
136+
/p2/var/php_gcov/PHP_4_4/ext/sysvmsg/sysvmsg.c: In function `zif_msg_receive':
137+
/p2/var/php_gcov/PHP_4_4/ext/sysvmsg/sysvmsg.c:318: warning: passing arg 2 of `php_var_unserialize' from incompatible pointer type
138+
/p2/var/php_gcov/PHP_4_4/ext/yp/yp.c: In function `zif_yp_err_string':
139+
/p2/var/php_gcov/PHP_4_4/ext/yp/yp.c:372: warning: assignment discards qualifiers from pointer target type
140+
Zend/zend_language_scanner.c:5944: warning: `yy_fatal_error' defined but not used
141+
Zend/zend_language_scanner.c:2627: warning: `yy_last_accepting_state' defined but not used
142+
Zend/zend_language_scanner.c:2628: warning: `yy_last_accepting_cpos' defined but not used
143+
Zend/zend_language_scanner.c:2634: warning: `yy_more_flag' defined but not used
144+
Zend/zend_language_scanner.c:2635: warning: `yy_more_len' defined but not used
145+
Zend/zend_language_scanner.c:5483: warning: `yyunput' defined but not used
146+
Zend/zend_language_scanner.c:5929: warning: `yy_top_state' defined but not used
147+
conflicts: 2 shift/reduce
148+
Zend/zend_ini_scanner.c:457: warning: `yy_last_accepting_state' defined but not used
149+
Zend/zend_ini_scanner.c:458: warning: `yy_last_accepting_cpos' defined but not used
150+
Zend/zend_ini_scanner.c:1361: warning: `yyunput' defined but not used
151+
/p2/var/php_gcov/PHP_4_4/Zend/zend_alloc.c: In function `_safe_emalloc':
152+
/p2/var/php_gcov/PHP_4_4/Zend/zend_alloc.c:237: warning: long int format, size_t arg (arg 3)
153+
/p2/var/php_gcov/PHP_4_4/Zend/zend_alloc.c:237: warning: long int format, size_t arg (arg 4)
154+
/p2/var/php_gcov/PHP_4_4/Zend/zend_alloc.c:237: warning: long int format, size_t arg (arg 5)
155+
/p2/var/php_gcov/PHP_4_4/Zend/zend_ini.c:338: warning: `zend_ini_displayer_cb' defined but not used
156+
ext/mysql/libmysql/my_tempnam.o(.text+0x80): In function `my_tempnam':
157+
/p2/var/php_gcov/PHP_4_4/ext/mysql/libmysql/my_tempnam.c:115: warning: the use of `tempnam' is dangerous, better use `mkstemp'
158+
ext/mysql/libmysql/my_tempnam.o(.text+0x80): In function `my_tempnam':
159+
/p2/var/php_gcov/PHP_4_4/ext/mysql/libmysql/my_tempnam.c:115: warning: the use of `tempnam' is dangerous, better use `mkstemp'
160+
ext/ming/ming.o(.text+0xc115): In function `zim_swfmovie_namedAnchor':
161+
/p2/var/php_gcov/PHP_5_2/ext/ming/ming.c:2207: undefined reference to `SWFMovie_namedAnchor'
162+
/p2/var/php_gcov/PHP_5_2/ext/ming/ming.c:2209: undefined reference to `SWFMovie_xpto'
163+
/p2/var/php_gcov/PHP_5_2/ext/ming/ming.c:2259: undefined reference to `SWFMovie_foo'
164+
ext/ming/ming.o(.text+0x851): In function `zif_ming_setSWFCompression':
165+
/p2/var/php_gcov/PHP_5_2/ext/ming/ming.c:154: undefined reference to `Ming_setSWFCompression'
166+
";
167+
168+
$gcc_regex = '/^((.+)(\(\.text\+0x[[:xdigit:]]+\))?: In function [`\'](\w+)\':\s+)?'.
169+
'((?(1)(?(3)[^:\n]+|\2)|[^:\n]+)):(\d+): (?:(error|warning):\s+)?(.+)'.
170+
str_repeat('(?:\s+\5:(\d+): (?:(error|warning):\s+)?(.+))?', 99). // capture up to 100 errors
171+
'/m';
172+
173+
174+
var_dump(preg_match_all($gcc_regex, $sampledata, $m, PREG_SET_ORDER));
175+
print_r($m);
176+
177+
178+
var_dump(preg_match_all('|(\w+)://([^\s"<]*[\w+#?/&=])|', "This is a text string", $matches, PREG_SET_ORDER));
179+
var_dump($matches);
180+
181+
/**
182+
* @return mixed
183+
*/
184+
function func1(){
185+
$string = 'what the word and the other word the';
186+
preg_match_all('/(?P<word>the)/', $string, $matches);
187+
return $matches['word'];
188+
}
189+
$words = func1();
190+
var_dump($words);
191+
192+
193+
$pattern =
194+
"/\s([\w_\.\/]+)(?:=([\'\"]?(?:[\w\d\s\?=\(\)\.,'_#\/\\:;&-]|(?:\\\\\"|\\\')?)+[\'\"]?))?/";
195+
$context = "<simpletag an_attribute=\"simpleValueInside\">";
196+
197+
$match = array();
198+
199+
if ($result = preg_match_all($pattern, $context, $match))
200+
{
201+
var_dump($result);
202+
var_dump($match);
203+
}
204+
205+
206+
var_dump(preg_match_all('/\d+/', '123 456 789 012', $match, 0));
207+
var_dump($match);

tests/phpt/dl/004_preg_replace.php

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
@ok callback benchmark k2_skip
2+
<?php
3+
4+
var_dump (preg_replace ('~(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)~', '\26\25\24\23\22\21\20\19\18\17\16\15\14\13\12\11\10\9\8\7\6\5\4\3\2\1', 'abcdefghijklmnopqrstuvwxyz'));
5+
var_dump (preg_replace ('~(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)~', '$26$25$24$23$22$21$20$19$18$17$16$15$14$13$12$11$10$9$8$7$6$5$4$3$2$1', 'abcdefghijklmnopqrstuvwxyz'));
6+
var_dump (preg_replace ('~(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)~', '$26$25$24$23$22$21$20$19$18$17$16$15$14$13$12$11$10$9$8$7$6$5$4$3$2$1', 'abcdefghijklmnopqrstuvwxyz'));
7+
var_dump (preg_replace ('~(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)~', '${26}${25}${24}${23}${22}${21}${20}${19}${18}${17}${16}${15}${14}${13}${12}${11}${10}${9}${8}${7}${6}${5}${4}${3}${2}${1}', 'abcdefghijklmnopqrstuvwxyz'));
8+
9+
var_dump (preg_replace ('~a|~', 'b', 'c'));
10+
var_dump (preg_replace ('~a|~', 'b', 'a'));
11+
var_dump (preg_replace ('~a|~', 'a', 'b'));
12+
13+
var_dump (preg_replace ('~|q~', '{\0}', 'eq'));
14+
var_dump (preg_replace ('~|q~', '{\0}', 'ex'));
15+
16+
var_dump (preg_replace ('~|q~', 'w', 'e'));
17+
var_dump (preg_replace ('~|q~', 'w', 'q'));
18+
/* bug in PHP
19+
var_dump (preg_replace ('~|é~u', 'ï', 'ð'));
20+
*/
21+
var_dump (preg_replace ('~|é~u', 'ï', 'é'));
22+
23+
24+
$string = 'April 15, 2003';
25+
$pattern = '/(\w+) (\d+), (\d+)/i';
26+
$replacement = '${1}1,$3';
27+
var_dump (preg_replace($pattern, $replacement, $string));
28+
var_dump (preg_replace('/(\w+) (\d+), (\d+)/i', $replacement, $string));
29+
30+
31+
$string = 'The quick brown fox jumped over the lazy dog.';
32+
$patterns = array();
33+
$patterns[0] = '/quick/';
34+
$patterns[1] = '/brown/';
35+
$patterns[2] = '/fox/';
36+
$replacements = array();
37+
$replacements[2] = 'bear';
38+
$replacements[1] = 'black';
39+
$replacements[0] = 'slow';
40+
var_dump (preg_replace($patterns, $replacements, $string));
41+
42+
ksort($patterns);
43+
ksort($replacements);
44+
var_dump (preg_replace($patterns, $replacements, $string));
45+
46+
47+
$patterns = array ('/(19|20)(\d{2})-(\d{1,2})-(\d{1,2})/',
48+
'/^\s*{(\w+)}\s*=/');
49+
$replace = array ('\3/\4/\1\2', '$\1 =');
50+
echo preg_replace($patterns, $replace, '{startDate} = 1999-5-27');
51+
52+
53+
$str = 'foo o';
54+
$str = preg_replace('/\s\s+/', ' ', $str);
55+
// This will be 'foo o' now
56+
echo $str;
57+
58+
59+
$count = 5;
60+
echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count);
61+
echo $count;
62+
63+
64+
var_dump (preg_replace ('~a|~', 'b', 'a'));
65+
var_dump (preg_replace ('~a|~', 'a', 'b'));
66+
67+
68+
var_dump(preg_replace(array('@//.*@', '@/\*.*\*/@sU'), array('', 'preg_replace("/[^\r\n]+/", "", \'$0\')'), "hello\n//x \n/*\ns\n*/"));
69+
70+
#var_dump(preg_replace('', array(), ''));
71+
72+
73+
var_dump(preg_replace(array('/\da(.)/ui', '@..@'), '$1', '12Abc'));
74+
var_dump(preg_replace(array('/\da(.)/ui', '@(.)@'), '$1', array('x','a2aA', '1av2Ab')));
75+
76+
77+
var_dump(preg_replace(array('/[\w]+/'), array('$'), array('xyz', 'bdbd')));
78+
var_dump(preg_replace(array('/\s+/', '~[b-d]~'), array('$'), array('x y', 'bd bc')));
79+
80+
81+
/*
82+
PHP 5.2.0 - 5.3.6 bug
83+
$text = '[CODE]&lt;td align=&quot;$stylevar[right]&quot;&gt;[/CODE]';
84+
$result = preg_replace(array('#\[(right)\](((?R)|[^[]+?|\[)*)\[/\\1\]#siU', '#\[(right)\](((?R)|[^[]+?|\[)*)\[/\\1\]#siU'), '', $text);
85+
var_dump($text);
86+
var_dump($result);
87+
88+
$result = preg_replace('#\[(right)\](((?R)|[^[]+?|\[)*)\[/\\1\]#siU', '', $text);
89+
var_dump($text);
90+
var_dump($result);
91+
*/

0 commit comments

Comments
 (0)