mb_strpos()/mb_stripos(): Add support for negative offset

This commit is contained in:
Francois Laupretre 2016-01-05 16:41:10 +01:00 committed by Nikita Popov
parent 882f97042b
commit d0d9e7251e
8 changed files with 266 additions and 155 deletions

View File

@ -2262,7 +2262,7 @@ PHP_FUNCTION(mb_strlen)
PHP_FUNCTION(mb_strpos)
{
int n, reverse = 0;
zend_long offset = 0;
zend_long offset = 0, slen;
mbfl_string haystack, needle;
char *enc_name = NULL;
size_t enc_name_len, haystack_len, needle_len;
@ -2297,7 +2297,11 @@ PHP_FUNCTION(mb_strpos)
}
}
if (offset < 0 || offset > mbfl_strlen(&haystack)) {
slen = mbfl_strlen(&haystack);
if (offset < 0) {
offset += slen;
}
if (offset < 0 || offset > slen) {
php_error_docref(NULL, E_WARNING, "Offset not contained in string");
RETURN_FALSE;
}
@ -4877,6 +4881,9 @@ MBSTRING_API int php_mb_stripos(int mode, const char *old_haystack, unsigned int
break;
}
} else {
if (offset < 0) {
offset += (long)haystack_char_len;
}
if (offset < 0 || offset > haystack_char_len) {
php_error_docref(NULL, E_WARNING, "Offset not contained in string");
break;

View File

@ -73,17 +73,11 @@ bool(false)
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
> Offset: -1
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
> Offset: -3
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
int(8)
> Offset: -6
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
int(8)
> Offset: -20
Warning: mb_strpos(): Offset not contained in string in %s on line %d
@ -133,17 +127,11 @@ bool(false)
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
> Offset: -1
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
> Offset: -3
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
int(8)
> Offset: -6
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
int(8)
> Offset: -20
Warning: mb_stripos(): Offset not contained in string in %s on line %d

View File

@ -1,10 +1,7 @@
--TEST--
mb_stripos()
--SKIPIF--
<?php
extension_loaded('mbstring') or die('skip');
function_exists('mb_stripos') or die("skip mb_stripos() is not available in this build");
?>
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
--FILE--
<?php
// TODO: Add more encodings
@ -17,43 +14,62 @@ include_once('common.inc');
// Test string
$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
$slen = mb_strlen($euc_jp, 'EUC-JP');
echo "String len: $slen\n";
// EUC-JP - With encoding parameter
mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
echo "== POSITIVE OFFSET ==\n";
print mb_stripos($euc_jp,b'日本語', 0, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, b'日本語', 0, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, b'0', 0, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, 3, 0, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, 0, 0, 'EUC-JP') . "\n";
print mb_stripos($euc_jp,b'日本語', 15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, b'日本語', 15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, b'0', 15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, 3, 15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, 0, 15, 'EUC-JP') . "\n";
// Negative offset
// Note: PHP Warning - offset is negative.
// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50)
echo "== NEGATIVE OFFSET ==\n";
$r = mb_stripos($euc_jp,b'日本語', -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_stripos($euc_jp, b'0', -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_stripos($euc_jp, 3, -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_stripos($euc_jp, 0, -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_stripos($euc_jp,b'日本語', -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
print mb_stripos($euc_jp, b'日本語', -15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, b'0', -15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, 3, -15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, 0, -15, 'EUC-JP') . "\n";
print mb_stripos($euc_jp, 0, -43, 'EUC-JP') . "\n";
// Invalid offset - should return false with warning
print ("== INVALID OFFSET ==\n");
$r = mb_stripos($euc_jp, b'日本語', 44, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, b'日本語', 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, b'0', 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, 3, 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, 0, 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, b'日本語', -50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, b'0', -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, 3, -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, 0, -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_stripos($euc_jp, 0, -44, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
// Out of range - should return false
print ("== OUT OF RANGE ==\n");
$r = mb_stripos($euc_jp,b'日本語', 40, 'EUC-JP');
$r = mb_stripos($euc_jp, b'日本語', 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_stripos($euc_jp, b'0', 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
@ -61,12 +77,19 @@ $r = mb_stripos($euc_jp, 3, 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_stripos($euc_jp, 0, 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
// Note: Returned NULL string
// echo gettype($r). ' val '. $r ."\n";
$r = mb_stripos($euc_jp, b'日本語', -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_stripos($euc_jp, b'0', -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_stripos($euc_jp, 3, -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_stripos($euc_jp, 0, -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
// Non-existent
echo "== NON-EXISTENT ==\n";
$r = mb_stripos($euc_jp, b'韓国語', 0, 'EUC-JP');
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
$r = mb_stripos($euc_jp, b"\n", 0, 'EUC-JP');
@ -75,30 +98,32 @@ $r = mb_stripos($euc_jp, b"\n", 0, 'EUC-JP');
// EUC-JP - No encoding parameter
echo "== NO ENCODING PARAMETER ==\n";
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
print mb_stripos($euc_jp,b'日本語', 0) . "\n";
print mb_stripos($euc_jp, b'日本語', 0) . "\n";
print mb_stripos($euc_jp, b'0', 0) . "\n";
print mb_stripos($euc_jp, 3, 0) . "\n";
print mb_stripos($euc_jp, 0, 0) . "\n";
$r = mb_stripos($euc_jp,b'韓国語', 0);
$r = mb_stripos($euc_jp, b'韓国語', 0);
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
$r = mb_stripos($euc_jp,b"\n", 0);
$r = mb_stripos($euc_jp, b"\n", 0);
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
// EUC-JP - No offset and encoding parameter
echo "== NO OFFSET AND ENCODING PARAMETER ==\n";
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
print mb_stripos($euc_jp,b'日本語') . "\n";
print mb_stripos($euc_jp, b'日本語') . "\n";
print mb_stripos($euc_jp, b'0') . "\n";
print mb_stripos($euc_jp, 3) . "\n";
print mb_stripos($euc_jp, 0) . "\n";
$r = mb_stripos($euc_jp,b'韓国語');
$r = mb_stripos($euc_jp, b'韓国語');
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
$r = mb_stripos($euc_jp,b"\n");
$r = mb_stripos($euc_jp, b"\n");
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
@ -113,11 +138,10 @@ $r = mb_stripos($euc_jp, $t_obj, 'EUC-JP');
($r === NULL) ? print("OK_OBJECT\n") : print("NG_OBJECT\n");
$r = mb_stripos($euc_jp, $t_obj, 'BAD_ENCODING');
($r === NULL) ? print("OK_BAD_ENCODING\n") : print("NG_BAD_ENCODING\n");
?>
==DONE==
--EXPECT--
String len: 43
== POSITIVE OFFSET ==
10
0
@ -128,27 +152,41 @@ $r = mb_stripos($euc_jp, $t_obj, 'BAD_ENCODING');
33
30
== NEGATIVE OFFSET ==
34
30
33
30
0
== INVALID OFFSET ==
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_INVALID_OFFSET
ERR: Warning
OK_INVALID_OFFSET
== OUT OF RANGE ==
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
== NON-EXISTENT ==
OK_STR
OK_NEWLINE
@ -175,4 +213,4 @@ ERR: Warning
OK_OBJECT
ERR: Warning
OK_BAD_ENCODING
==DONE==

View File

@ -8,10 +8,9 @@ if (PHP_INT_SIZE != 8) die('skip 64-bit only');
?>
--FILE--
<?php
/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
* Description: Finds position of first occurrence of a string within another, case insensitive
/* Prototype : int mb_stripos(string $haystack, string $needle [, int $offset [, string $encoding]])
* Description: Find position of first occurrence of a string within another, case insensitive
* Source code: ext/mbstring/mbstring.c
* Alias to functions:
*/
/*
@ -52,45 +51,47 @@ $inputs = array(
/*1*/ 0,
1,
12345,
-5,
-2345,
// float data
/*5*/ 10.5,
-10.5,
/*6*/ 10.5,
-5.5,
-100.5,
12.3456789000e10,
12.3456789000E-10,
.5,
// null data
/*10*/ NULL,
/*12*/ NULL,
null,
// boolean data
/*12*/ true,
/*14*/ true,
false,
TRUE,
FALSE,
// empty data
/*16*/ "",
/*18*/ "",
'',
// string data
/*18*/ "string",
/*20*/ "string",
'string',
$heredoc,
// object data
/*21*/ new classA(),
/*23*/ new classA(),
// undefined data
/*22*/ @$undefined_var,
/*24*/ @$undefined_var,
// unset data
/*23*/ @$unset_var,
/*25*/ @$unset_var,
// resource variable
/*24*/ $fp
/*26*/ $fp
);
// loop through each element of $inputs to check the behavior of mb_stripos()
@ -120,28 +121,28 @@ Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 4 --
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
int(8)
-- Iteration 5 --
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 6 --
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 7 --
int(8)
-- Iteration 8 --
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 8 --
int(8)
-- Iteration 9 --
int(8)
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 10 --
int(8)
@ -162,14 +163,10 @@ int(8)
int(8)
-- Iteration 16 --
Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d
NULL
int(8)
-- Iteration 17 --
Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d
NULL
int(8)
-- Iteration 18 --
@ -188,16 +185,26 @@ NULL
-- Iteration 21 --
Warning: mb_stripos() expects parameter 3 to be integer, object given in %s on line %d
Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d
NULL
-- Iteration 22 --
int(8)
Warning: mb_stripos() expects parameter 3 to be integer, string given in %s on line %d
NULL
-- Iteration 23 --
int(8)
Warning: mb_stripos() expects parameter 3 to be integer, object given in %s on line %d
NULL
-- Iteration 24 --
int(8)
-- Iteration 25 --
int(8)
-- Iteration 26 --
Warning: mb_stripos() expects parameter 3 to be integer, resource given in %s on line %d
NULL

View File

@ -7,10 +7,9 @@ function_exists('mb_stripos') or die("skip mb_stripos() is not available in this
?>
--FILE--
<?php
/* Prototype : int mb_stripos(string haystack, string needle [, int offset [, string encoding]])
* Description: Finds position of first occurrence of a string within another, case insensitive
/* Prototype : int mb_stripos(string $haystack, string $needle [, int $offset [, string $encoding]])
* Description: Find position of first occurrence of a string within another, case insensitive
* Source code: ext/mbstring/mbstring.c
* Alias to functions:
*/
/*
@ -34,7 +33,7 @@ $needle_mb = base64_decode('44CC');
* mb_stripos should not be able to accept negative values as $offset.
* 60 is larger than *BYTE* count for $string_mb
*/
for ($i = -10; $i <= 60; $i += 10) {
for ($i = -30; $i <= 60; $i += 10) {
echo "\n**-- Offset is: $i --**\n";
echo "-- ASCII String --\n";
var_dump(mb_stripos($string_ascii, $needle_ascii, $i));
@ -48,7 +47,7 @@ echo "Done";
--EXPECTF--
*** Testing mb_stripos() : usage variations ***
**-- Offset is: -10 --**
**-- Offset is: -30 --**
-- ASCII String --
Warning: mb_stripos(): Offset not contained in string in %s on line %d
@ -58,6 +57,18 @@ bool(false)
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
**-- Offset is: -20 --**
-- ASCII String --
int(9)
--Multibyte String --
int(9)
**-- Offset is: -10 --**
-- ASCII String --
int(20)
--Multibyte String --
int(20)
**-- Offset is: 0 --**
-- ASCII String --
int(9)
@ -116,4 +127,3 @@ bool(false)
Warning: mb_stripos(): Offset not contained in string in %s on line %d
bool(false)
Done

View File

@ -14,10 +14,14 @@ include_once('common.inc');
// Test string
$euc_jp = b'0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
$slen = mb_strlen($euc_jp, 'EUC-JP');
echo "String len: $slen\n";
// EUC-JP - With encoding parameter
mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
echo "== POSITIVE OFFSET ==\n";
print mb_strpos($euc_jp, b'日本語', 0, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, b'0', 0, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 3, 0, 'EUC-JP') . "\n";
@ -27,29 +31,44 @@ print mb_strpos($euc_jp, b'0', 15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 3, 15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 0, 15, 'EUC-JP') . "\n";
// Negative offset
// Note: PHP Warning - offset is negative.
// Note: For offset(-15). It does not return position of latter string. (ie the same result as -50)
echo "== NEGATIVE OFFSET ==\n";
$r = mb_strpos($euc_jp, b'ÆüËܸì', -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_strpos($euc_jp, b'0', -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_strpos($euc_jp, 3, -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
$r = mb_strpos($euc_jp, 0, -15, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
print mb_strpos($euc_jp, b'日本語', -15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, b'0', -15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 3, -15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 0, -15, 'EUC-JP') . "\n";
print mb_strpos($euc_jp, 0, -43, 'EUC-JP') . "\n";
// Invalid offset - should return false with warning
print ("== INVALID OFFSET ==\n");
$r = mb_strpos($euc_jp, b'日本語', 44, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, b'日本語', 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, b'0', 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, 3, 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, 0, 50, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, b'日本語', -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, b'0', -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, 3, -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, 0, -50, 'EUC-JP');
($r === FALSE) ? print "OK_NEGATIVE_OFFSET\n" : print "NG_NEGATIVE_OFFSET\n";
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
$r = mb_strpos($euc_jp, 0, -44, 'EUC-JP');
($r === FALSE) ? print "OK_INVALID_OFFSET\n" : print "NG_INVALID_OFFSET\n";
// Out of range - should return false
print ("== OUT OF RANGE ==\n");
$r = mb_strpos($euc_jp, b'日本語', 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_strpos($euc_jp, b'0', 40, 'EUC-JP');
@ -58,12 +77,19 @@ $r = mb_strpos($euc_jp, 3, 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_strpos($euc_jp, 0, 40, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
// Note: Returned NULL string
// echo gettype($r). ' val '. $r ."\n";
$r = mb_strpos($euc_jp, b'日本語', -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_strpos($euc_jp, b'0', -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_strpos($euc_jp, 3, -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
$r = mb_strpos($euc_jp, 0, -3, 'EUC-JP');
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
// Non-existent
echo "== NON-EXISTENT ==\n";
$r = mb_strpos($euc_jp, b'韓国語', 0, 'EUC-JP');
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
$r = mb_strpos($euc_jp, b"\n", 0, 'EUC-JP');
@ -72,6 +98,7 @@ $r = mb_strpos($euc_jp, b"\n", 0, 'EUC-JP');
// EUC-JP - No encoding parameter
echo "== NO ENCODING PARAMETER ==\n";
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
print mb_strpos($euc_jp, b'日本語', 0) . "\n";
@ -86,6 +113,7 @@ $r = mb_strpos($euc_jp, b"\n", 0);
// EUC-JP - No offset and encoding parameter
echo "== NO OFFSET AND ENCODING PARAMETER ==\n";
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
print mb_strpos($euc_jp, b'日本語') . "\n";
@ -110,11 +138,10 @@ $r = mb_strpos($euc_jp, $t_obj, 'EUC-JP');
($r === NULL) ? print("OK_OBJECT\n") : print("NG_OBJECT\n");
$r = mb_strpos($euc_jp, $t_obj, 'BAD_ENCODING');
($r === NULL) ? print("OK_BAD_ENCODING\n") : print("NG_BAD_ENCODING\n");
?>
==DONE==
--EXPECT--
String len: 43
== POSITIVE OFFSET ==
10
0
@ -125,27 +152,41 @@ $r = mb_strpos($euc_jp, $t_obj, 'BAD_ENCODING');
33
30
== NEGATIVE OFFSET ==
34
30
33
30
0
== INVALID OFFSET ==
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_NEGATIVE_OFFSET
OK_INVALID_OFFSET
ERR: Warning
OK_INVALID_OFFSET
ERR: Warning
OK_INVALID_OFFSET
== OUT OF RANGE ==
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
OK_OUT_RANGE
== NON-EXISTENT ==
OK_STR
OK_NEWLINE
@ -172,4 +213,4 @@ ERR: Warning
OK_OBJECT
ERR: Warning
OK_BAD_ENCODING
==DONE==

View File

@ -51,45 +51,47 @@ $inputs = array(
/*1*/ 0,
1,
12345,
-5,
-2345,
// float data
/*5*/ 10.5,
-10.5,
/*6*/ 10.5,
-5.5,
-100.5,
12.3456789000e10,
12.3456789000E-10,
.5,
// null data
/*10*/ NULL,
/*12*/ NULL,
null,
// boolean data
/*12*/ true,
/*14*/ true,
false,
TRUE,
FALSE,
// empty data
/*16*/ "",
/*18*/ "",
'',
// string data
/*18*/ "string",
/*20*/ "string",
'string',
$heredoc,
// object data
/*21*/ new classA(),
/*23*/ new classA(),
// undefined data
/*22*/ @$undefined_var,
/*24*/ @$undefined_var,
// unset data
/*23*/ @$unset_var,
/*25*/ @$unset_var,
// resource variable
/*24*/ $fp
/*26*/ $fp
);
// loop through each element of $inputs to check the behavior of mb_strpos()
@ -119,28 +121,28 @@ Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 4 --
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
int(8)
-- Iteration 5 --
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 6 --
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 7 --
int(8)
-- Iteration 8 --
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 8 --
int(8)
-- Iteration 9 --
int(8)
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
-- Iteration 10 --
int(8)
@ -161,14 +163,10 @@ int(8)
int(8)
-- Iteration 16 --
Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d
NULL
int(8)
-- Iteration 17 --
Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d
NULL
int(8)
-- Iteration 18 --
@ -187,16 +185,26 @@ NULL
-- Iteration 21 --
Warning: mb_strpos() expects parameter 3 to be integer, object given in %s on line %d
Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d
NULL
-- Iteration 22 --
int(8)
Warning: mb_strpos() expects parameter 3 to be integer, string given in %s on line %d
NULL
-- Iteration 23 --
int(8)
Warning: mb_strpos() expects parameter 3 to be integer, object given in %s on line %d
NULL
-- Iteration 24 --
int(8)
-- Iteration 25 --
int(8)
-- Iteration 26 --
Warning: mb_strpos() expects parameter 3 to be integer, resource given in %s on line %d
NULL

View File

@ -33,7 +33,7 @@ $needle_mb = base64_decode('44CC');
* mb_strpos should not be able to accept negative values as $offset.
* 60 is larger than *BYTE* count for $string_mb
*/
for ($i = -10; $i <= 60; $i += 10) {
for ($i = -30; $i <= 60; $i += 10) {
echo "\n**-- Offset is: $i --**\n";
echo "-- ASCII String --\n";
var_dump(mb_strpos($string_ascii, $needle_ascii, $i));
@ -47,7 +47,7 @@ echo "Done";
--EXPECTF--
*** Testing mb_strpos() : usage variations ***
**-- Offset is: -10 --**
**-- Offset is: -30 --**
-- ASCII String --
Warning: mb_strpos(): Offset not contained in string in %s on line %d
@ -57,6 +57,18 @@ bool(false)
Warning: mb_strpos(): Offset not contained in string in %s on line %d
bool(false)
**-- Offset is: -20 --**
-- ASCII String --
int(9)
--Multibyte String --
int(9)
**-- Offset is: -10 --**
-- ASCII String --
int(20)
--Multibyte String --
int(20)
**-- Offset is: 0 --**
-- ASCII String --
int(9)