Skip to content

Commit 12cb36d

Browse files
committed
Allow empty needles in mb_strpos and mb_strstr function family.
MBstring analogous implementation to 6d57848
1 parent 2ede8db commit 12cb36d

9 files changed

+281
-26
lines changed

ext/mbstring/libmbfl/mbfl/mbfilter.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -855,8 +855,12 @@ mbfl_strpos(
855855
needle_u8 = needle;
856856
}
857857

858-
if (needle_u8->len < 1) {
859-
result = (size_t) -8;
858+
if (needle_u8->len == 0) {
859+
if (reverse) {
860+
result = haystack_u8->len;
861+
} else {
862+
result = (size_t) 0;
863+
}
860864
goto out;
861865
}
862866

ext/mbstring/mbstring.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2110,11 +2110,6 @@ PHP_FUNCTION(mb_strpos)
21102110
}
21112111
}
21122112

2113-
if (needle.len == 0) {
2114-
php_error_docref(NULL, E_WARNING, "Empty delimiter");
2115-
RETURN_FALSE;
2116-
}
2117-
21182113
n = mbfl_strpos(&haystack, &needle, offset, reverse);
21192114
if (!mbfl_is_error(n)) {
21202115
RETVAL_LONG(n);
@@ -2222,11 +2217,6 @@ PHP_FUNCTION(mb_stripos)
22222217
return;
22232218
}
22242219

2225-
if (needle.len == 0) {
2226-
php_error_docref(NULL, E_WARNING, "Empty delimiter");
2227-
RETURN_FALSE;
2228-
}
2229-
22302220
n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, offset, from_encoding);
22312221

22322222
if (!mbfl_is_error(n)) {
@@ -2279,11 +2269,6 @@ PHP_FUNCTION(mb_strstr)
22792269
RETURN_FALSE;
22802270
}
22812271

2282-
if (needle.len == 0) {
2283-
php_error_docref(NULL, E_WARNING, "Empty delimiter");
2284-
RETURN_FALSE;
2285-
}
2286-
22872272
n = mbfl_strpos(&haystack, &needle, 0, 0);
22882273
if (!mbfl_is_error(n)) {
22892274
if (part) {
@@ -2383,11 +2368,6 @@ PHP_FUNCTION(mb_stristr)
23832368
RETURN_FALSE;
23842369
}
23852370

2386-
if (!needle.len) {
2387-
php_error_docref(NULL, E_WARNING, "Empty delimiter");
2388-
RETURN_FALSE;
2389-
}
2390-
23912371
n = php_mb_stripos(0, (char *)haystack.val, haystack.len, (char *)needle.val, needle.len, 0, from_encoding);
23922372
if (mbfl_is_error(n)) {
23932373
RETURN_FALSE;
@@ -4882,10 +4862,6 @@ MBSTRING_API size_t php_mb_stripos(int mode, const char *old_haystack, size_t ol
48824862
break;
48834863
}
48844864

4885-
if (needle.len == 0) {
4886-
break;
4887-
}
4888-
48894865
if (offset != 0) {
48904866
size_t haystack_char_len = mbfl_strlen(&haystack);
48914867

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
--TEST--
2+
Test mb_stripos() function : with empty needle
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
mb_internal_encoding('UTF-8');
12+
13+
$string_ascii = 'abc def';
14+
// Japanese string in UTF-8
15+
$string_mb = "日本語テキストです。0123456789。";
16+
17+
echo "\n-- ASCII string 1 --\n";
18+
var_dump(mb_stripos($string_ascii, '', 2, 'ISO-8859-1'));
19+
20+
echo "\n-- ASCII string 2 --\n";
21+
var_dump(mb_stripos($string_ascii, ''));
22+
23+
echo "\n-- Multibyte string 1 --\n";
24+
var_dump(mb_stripos($string_mb, '', 2, 'ISO-8859-1'));
25+
26+
echo "\n-- Multibyte string 2 --\n";
27+
var_dump(mb_stripos($string_mb, ''));
28+
29+
?>
30+
--EXPECT--
31+
-- ASCII string 1 --
32+
int(0)
33+
34+
-- ASCII string 2 --
35+
int(0)
36+
37+
-- Multibyte string 1 --
38+
int(0)
39+
40+
-- Multibyte string 2 --
41+
int(0)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
Test mb_stristr() function : with empty needle
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_stristr') or die("skip mb_stristr() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
mb_internal_encoding('UTF-8');
12+
13+
$string_ascii = 'abc def';
14+
// Japanese string in UTF-8
15+
$string_mb = "日本語テキストです。0123456789。";
16+
17+
echo "\n-- ASCII string --\n";
18+
var_dump(mb_stristr($string_ascii, '', false, 'ISO-8859-1'));
19+
var_dump(mb_stristr($string_ascii, ''));
20+
var_dump(mb_stristr($string_ascii, '', true));
21+
22+
echo "\n-- Multibyte string --\n";
23+
var_dump(mb_stristr($string_mb, ''));
24+
var_dump(mb_stristr($string_mb, '', false, 'utf-8'));
25+
var_dump(mb_stristr($string_mb, '', true));
26+
27+
?>
28+
--EXPECT--
29+
-- ASCII string --
30+
string(7) "abc def"
31+
string(7) "abc def"
32+
string(0) ""
33+
34+
-- Multibyte string --
35+
string(53) "日本語テキストです。0123456789。"
36+
string(53) "日本語テキストです。0123456789。"
37+
string(0) ""
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
--TEST--
2+
Test mb_strpos() function : with empty needle
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_strpos') or die("skip mb_strpos() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
mb_internal_encoding('UTF-8');
12+
13+
$string_ascii = 'abc def';
14+
// Japanese string in UTF-8
15+
$string_mb = "日本語テキストです。0123456789。";
16+
17+
echo "\n-- ASCII string 1 --\n";
18+
var_dump(mb_strpos($string_ascii, '', 2, 'ISO-8859-1'));
19+
20+
echo "\n-- ASCII string 2 --\n";
21+
var_dump(mb_strpos($string_ascii, ''));
22+
23+
echo "\n-- Multibyte string 1 --\n";
24+
var_dump(mb_strpos($string_mb, '', 2, 'ISO-8859-1'));
25+
26+
echo "\n-- Multibyte string 2 --\n";
27+
var_dump(mb_strpos($string_mb, ''));
28+
29+
?>
30+
--EXPECT--
31+
-- ASCII string 1 --
32+
int(0)
33+
34+
-- ASCII string 2 --
35+
int(0)
36+
37+
-- Multibyte string 1 --
38+
int(0)
39+
40+
-- Multibyte string 2 --
41+
int(0)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
Test mb_strrchr() function : with empty needle
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_strrchr') or die("skip mb_strrchr() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
mb_internal_encoding('UTF-8');
12+
13+
$string_ascii = 'abc def';
14+
// Japanese string in UTF-8
15+
$string_mb = "日本語テキストです。0123456789。";
16+
17+
echo "\n-- ASCII string --\n";
18+
var_dump(bin2hex(mb_strrchr($string_ascii, '', false, 'ISO-8859-1')));
19+
var_dump(bin2hex(mb_strrchr($string_ascii, '')));
20+
var_dump(bin2hex(mb_strrchr($string_ascii, '', true)));
21+
22+
echo "\n-- Multibyte string --\n";
23+
var_dump(bin2hex(mb_strrchr($string_mb, '')));
24+
var_dump(bin2hex(mb_strrchr($string_mb, '', false, 'utf-8')));
25+
var_dump(bin2hex(mb_strrchr($string_mb, '', true)));
26+
27+
?>
28+
--EXPECT--
29+
-- ASCII string --
30+
string(0) ""
31+
string(0) ""
32+
string(0) ""
33+
34+
-- Multibyte string --
35+
string(0) ""
36+
string(0) ""
37+
string(0) ""
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
--TEST--
2+
Test mb_strripos() function : with empty needle
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_strripos') or die("skip mb_strripos() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
mb_internal_encoding('UTF-8');
12+
13+
$string_ascii = 'abc def';
14+
// Japanese string in UTF-8
15+
$string_mb = "日本語テキストです。0123456789。";
16+
17+
echo "\n-- ASCII string 1 --\n";
18+
var_dump(mb_strripos($string_ascii, '', 2, 'ISO-8859-1'));
19+
20+
echo "\n-- ASCII string 2 --\n";
21+
var_dump(mb_strripos($string_ascii, ''));
22+
23+
echo "\n-- Multibyte string 1 --\n";
24+
var_dump(mb_strripos($string_mb, '', 2, 'ISO-8859-1'));
25+
26+
echo "\n-- Multibyte string 2 --\n";
27+
var_dump(mb_strripos($string_mb, ''));
28+
29+
?>
30+
--EXPECT--
31+
-- ASCII string 1 --
32+
int(7)
33+
34+
-- ASCII string 2 --
35+
int(7)
36+
37+
-- Multibyte string 1 --
38+
int(101)
39+
40+
-- Multibyte string 2 --
41+
int(53)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
--TEST--
2+
Test mb_strrpos() function : with empty needle
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_strrpos') or die("skip mb_strrpos() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
mb_internal_encoding('UTF-8');
12+
13+
$string_ascii = 'abc def';
14+
// Japanese string in UTF-8
15+
$string_mb = "日本語テキストです。0123456789。";
16+
17+
echo "\n-- ASCII string 1 --\n";
18+
var_dump(mb_strrpos($string_ascii, '', 2, 'ISO-8859-1'));
19+
20+
echo "\n-- ASCII string 2 --\n";
21+
var_dump(mb_strrpos($string_ascii, ''));
22+
23+
echo "\n-- Multibyte string 1 --\n";
24+
var_dump(mb_strrpos($string_mb, '', 2, 'ISO-8859-1'));
25+
26+
echo "\n-- Multibyte string 2 --\n";
27+
var_dump(mb_strrpos($string_mb, ''));
28+
29+
?>
30+
--EXPECT--
31+
-- ASCII string 1 --
32+
int(7)
33+
34+
-- ASCII string 2 --
35+
int(7)
36+
37+
-- Multibyte string 1 --
38+
int(101)
39+
40+
-- Multibyte string 2 --
41+
int(53)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
--TEST--
2+
Test mb_strstr() function : with empty needle
3+
--SKIPIF--
4+
<?php
5+
extension_loaded('mbstring') or die('skip');
6+
function_exists('mb_strstr') or die("skip mb_strstr() is not available in this build");
7+
?>
8+
--FILE--
9+
<?php
10+
11+
mb_internal_encoding('UTF-8');
12+
13+
$string_ascii = 'abc def';
14+
// Japanese string in UTF-8
15+
$string_mb = "日本語テキストです。0123456789。";
16+
17+
echo "\n-- ASCII string --\n";
18+
var_dump(mb_strstr($string_ascii, '', false, 'ISO-8859-1'));
19+
var_dump(mb_strstr($string_ascii, ''));
20+
var_dump(mb_strstr($string_ascii, '', true));
21+
22+
echo "\n-- Multibyte string --\n";
23+
var_dump(mb_strstr($string_mb, ''));
24+
var_dump(mb_strstr($string_mb, '', false, 'utf-8'));
25+
var_dump(mb_strstr($string_mb, '', true));
26+
27+
?>
28+
--EXPECT--
29+
-- ASCII string --
30+
string(7) "abc def"
31+
string(7) "abc def"
32+
string(0) ""
33+
34+
-- Multibyte string --
35+
string(53) "日本語テキストです。0123456789。"
36+
string(53) "日本語テキストです。0123456789。"
37+
string(0) ""

0 commit comments

Comments
 (0)