--TEST-- Test strpos() function --INI-- precision=14 --FILE-- <?php /* Prototype: int strpos ( string $haystack, mixed $needle [, int $offset] ); Description: Find position of first occurrence of a string */ echo "*** Testing basic functionality of strpos() ***\n"; var_dump( strpos("test string", "test") ); var_dump( strpos("test string", "string") ); var_dump( strpos("test string", "strin") ); var_dump( strpos("test string", "t s") ); var_dump( strpos("test string", "g") ); var_dump( strpos("te".chr(0)."st", chr(0)) ); var_dump( strpos("tEst", "test") ); var_dump( strpos("teSt", "test") ); var_dump( @strpos("", "") ); var_dump( @strpos("a", "") ); var_dump( @strpos("", "a") ); var_dump( @strpos("\\\\a", "\\a") ); echo "\n*** Testing stropos() to find various needles and a long string ***\n"; $string = "Hello world,012033 -3.3445 NULL TRUE FALSE\0 abcd\xxyz \x000 octal\n abcd$:Hello world"; /* needles in an array to get the position of needle in $string */ $needles = array( "Hello world", "WORLD", "\0", "\x00", "\x000", "abcd", "xyz", "octal", "-3", -3, "-3.344", -3.344, NULL, "NULL", "0", 0, TRUE, "TRUE", "1", 1, FALSE, "FALSE", " ", " ", 'b', '\n', "\n", "12", "12twelve", $string ); /* loop through to get the "needle" position in $string */ for( $i = 0; $i < count($needles); $i++ ) { echo "Position of '$needles[$i]' is => "; var_dump( strpos($string, $needles[$i]) ); } echo "\n*** Testing strpos() with possible variations in offset ***\n"; $offset_values = array ( 1, // offset = 1 "string", // offset as string, converts to zero NULL, // offset as string, converts to zero "", // offset as string, converts to zero "12string", // mixed string with int and chars "0", TRUE, NULL, FALSE, "string12", "12.3string", // mixed string with float and chars ); /* loop through to get the "needle" position in $string */ for( $i = 0; $i < count( $offset_values ); $i++ ) { echo "Position of 'Hello' with offset '$offset_values[$i]' is => "; var_dump( strpos($string, "Hello", $offset_values[$i]) ); } echo "\n*** Testing Miscelleneous input data ***\n"; echo "-- Passing objects as string and needle --\n"; /* we get "Catchable fatal error: saying Object of class needle could not be converted to string" by default when an object is passed instead of string: The error can be avoided by chosing the __toString magix method as follows: */ class string { function __toString() { return "Hello, world"; } } $obj_string = new string; class needle { function __toString() { return "world"; } } $obj_needle = new needle; var_dump( strpos("$obj_string", "$obj_needle") ); echo "\n-- Passing an array as string and needle --\n"; $needles = array("hello", "?world", "!$%**()%**[][[[&@#~!"); var_dump( strpos($needles, $needles) ); // won't work var_dump( strpos("hello?world,!$%**()%**[][[[&@#~!", "$needles[1]") ); // works var_dump( strpos("hello?world,!$%**()%**[][[[&@#~!", "$needles[2]") ); // works echo "\n-- Passing Resources as string and needle --\n"; $resource1 = fopen(__FILE__, "r"); $resource2 = opendir("."); var_dump( strpos($resource1, $resource1) ); var_dump( strpos($resource1, $resource2) ); echo "\n-- Posiibilities with null --\n"; var_dump( strpos("", NULL) ); var_dump( strpos(NULL, NULL) ); var_dump( strpos("a", NULL) ); var_dump( strpos("/x0", "0") ); // Hexadecimal NUL echo "\n-- A longer and heredoc string --\n"; $string = <<<EOD abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789 EOD; var_dump( strpos($string, "abcd") ); var_dump( strpos($string, "abcd", 72) ); // 72 -> "\n" in the first line var_dump( strpos($string, "abcd", 73) ); // 73 -> "abcd" in the second line var_dump( strpos($string, "9", (strlen($string)-1)) ); echo "\n-- A heredoc null string --\n"; $str = <<<EOD EOD; var_dump( strpos($str, "\0") ); var_dump( strpos($str, NULL) ); var_dump( strpos($str, "0") ); echo "\n-- simple and complex syntax strings --\n"; $needle = 'world'; /* Simple syntax */ var_dump( strpos("Hello, world", "$needle") ); // works var_dump( strpos("Hello, world'S", "$needle'S") ); // works var_dump( strpos("Hello, worldS", "$needleS") ); // won't work /* String with curly braces, complex syntax */ var_dump( strpos("Hello, worldS", "${needle}S") ); // works var_dump( strpos("Hello, worldS", "{$needle}S") ); // works echo "\n-- complex strings containing other than 7-bit chars --\n"; $str = chr(0).chr(128).chr(129).chr(234).chr(235).chr(254).chr(255); echo "-- Positions of some chars in the string '$str' are as follows --\n"; echo chr(128)." => "; var_dump( strpos($str, chr(128)) ); echo chr(255)." => "; var_dump( strpos($str, chr(255), 3) ); echo chr(256)." => "; var_dump( strpos($str, chr(256)) ); echo "\n*** Testing error conditions ***"; var_dump( strpos($string, "") ); var_dump( strpos() ); // zero argument var_dump( strpos("") ); // null argument var_dump( strpos($string) ); // without "needle" var_dump( strpos("a", "b", "c", "d") ); // args > expected var_dump( strpos($string, "test", strlen($string)+1) ); // offset > strlen() var_dump( strpos($string, "test", -1) ); // offset < 0 var_dump( strpos(NULL, "") ); echo "\nDone"; fclose($resource1); closedir($resource2); ?> --EXPECTF-- *** Testing basic functionality of strpos() *** int(0) int(5) int(5) int(3) int(10) int(2) bool(false) bool(false) bool(false) bool(false) bool(false) int(1) *** Testing stropos() to find various needles and a long string *** Position of 'Hello world' is => int(0) Position of 'WORLD' is => bool(false) Position of ' ' is => int(46) Position of ' ' is => int(46) Position of ' 0' is => int(58) Position of 'abcd' is => int(48) Position of 'xyz' is => int(54) Position of 'octal' is => int(61) Position of '-3' is => int(19) Position of '-3' is => bool(false) Position of '-3.344' is => int(19) Position of '-3.344' is => bool(false) Position of '' is => int(46) Position of 'NULL' is => int(31) Position of '0' is => int(12) Position of '0' is => int(46) Position of '1' is => bool(false) Position of 'TRUE' is => int(36) Position of '1' is => int(13) Position of '1' is => bool(false) Position of '' is => int(46) Position of 'FALSE' is => int(41) Position of ' ' is => int(5) Position of ' ' is => int(26) Position of 'b' is => int(49) Position of '\n' is => bool(false) Position of ' ' is => int(66) Position of '12' is => int(13) Position of '12twelve' is => bool(false) Position of 'Hello world,012033 -3.3445 NULL TRUE FALSE abcd\xxyz 0 octal abcd$:Hello world' is => int(0) *** Testing strpos() with possible variations in offset *** Position of 'Hello' with offset '1' is => int(74) Position of 'Hello' with offset 'string' is => int(0) Position of 'Hello' with offset '' is => int(0) Position of 'Hello' with offset '' is => int(0) Position of 'Hello' with offset '12string' is => int(74) Position of 'Hello' with offset '0' is => int(0) Position of 'Hello' with offset '1' is => int(74) Position of 'Hello' with offset '' is => int(0) Position of 'Hello' with offset '' is => int(0) Position of 'Hello' with offset 'string12' is => int(0) Position of 'Hello' with offset '12.3string' is => int(74) *** Testing Miscelleneous input data *** -- Passing objects as string and needle -- int(7) -- Passing an array as string and needle -- Notice: Array to string conversion in %s on line %d bool(false) int(5) int(12) -- Passing Resources as string and needle -- %s %s -- Posiibilities with null -- bool(false) bool(false) bool(false) int(2) -- A longer and heredoc string -- int(0) int(73) int(73) int(728) -- A heredoc null string -- bool(false) bool(false) bool(false) -- simple and complex syntax strings -- int(7) int(7) Notice: Undefined variable: needleS in %s on line %d Warning: strpos(): Empty delimiter in %s on line %d bool(false) int(7) int(7) -- complex strings containing other than 7-bit chars -- -- Positions of some chars in the string ' ' are as follows -- => int(1) => int(6) => int(0) *** Testing error conditions *** Warning: strpos(): Empty delimiter in %s on line %d bool(false) Warning: Wrong parameter count for strpos() in %s on line %d NULL Warning: Wrong parameter count for strpos() in %s on line %d NULL Warning: Wrong parameter count for strpos() in %s on line %d NULL Warning: Wrong parameter count for strpos() in %s on line %d NULL Warning: strpos(): Offset not contained in string in %s on line %d bool(false) Warning: strpos(): Offset not contained in string in %s on line %d bool(false) Warning: strpos(): Empty delimiter in %s on line %d bool(false) Done