xref: /PHP-7.3/ext/standard/tests/strings/strpos.phpt (revision 782352c5)
1--TEST--
2Test strpos() function
3--INI--
4precision=14
5--FILE--
6<?php
7/* Prototype: int strpos ( string $haystack, mixed $needle [, int $offset] );
8   Description: Find position of first occurrence of a string
9*/
10
11echo "*** Testing basic functionality of strpos() ***\n";
12var_dump( strpos("test string", "test") );
13var_dump( strpos("test string", "string") );
14var_dump( strpos("test string", "strin") );
15var_dump( strpos("test string", "t s") );
16var_dump( strpos("test string", "g") );
17var_dump( strpos("te".chr(0)."st", chr(0)) );
18var_dump( strpos("tEst", "test") );
19var_dump( strpos("teSt", "test") );
20var_dump( @strpos("", "") );
21var_dump( @strpos("a", "") );
22var_dump( @strpos("", "a") );
23var_dump( @strpos("\\\\a", "\\a") );
24
25
26echo "\n*** Testing strpos() to find various needles and a long string ***\n";
27$string =
28"Hello world,012033 -3.3445     NULL TRUE FALSE\0 abcd\xxyz \x000 octal\n
29abcd$:Hello world";
30
31/* needles in an array to get the position of needle in $string */
32$needles = array(
33  "Hello world",
34  "WORLD",
35  "\0",
36  "\x00",
37  "\x000",
38  "abcd",
39  "xyz",
40  "octal",
41  "-3",
42  -3,
43  "-3.344",
44  -3.344,
45  NULL,
46  "NULL",
47  "0",
48  0,
49  TRUE,
50  "TRUE",
51  "1",
52  1,
53  FALSE,
54  "FALSE",
55  " ",
56  "     ",
57  'b',
58  '\n',
59  "\n",
60  "12",
61  "12twelve",
62  $string
63);
64
65/* loop through to get the "needle" position in $string */
66for( $i = 0; $i < count($needles); $i++ ) {
67  echo "Position of '$needles[$i]' is => ";
68  var_dump( strpos($string, $needles[$i]) );
69}
70
71
72echo "\n*** Testing strpos() with possible variations in offset ***\n";
73$offset_values = array (
74  1,  // offset = 1
75  "string",  // offset as string, converts to zero
76  NULL,  // offset as string, converts to zero
77  "",  // offset as string, converts to zero
78  "12string",  // mixed string with int and chars
79  "0",
80  TRUE,
81  NULL,
82  FALSE,
83  "string12",
84  "12.3string",  // mixed string with float and chars
85  -10, // Not found
86  -15, // Found
87  -strlen($string),
88);
89
90/* loop through to get the "needle" position in $string */
91for( $i = 0; $i < count( $offset_values ); $i++ ) {
92  echo "Position of 'Hello' with offset '$offset_values[$i]' is => ";
93  var_dump( strpos($string, "Hello", $offset_values[$i]) );
94}
95
96
97echo "\n*** Testing Miscelleneous input data ***\n";
98
99echo "-- Passing objects as string and needle --\n";
100/* we get "Recoverable fatal error: saying Object of class needle could not be
101 converted to string" by default when an object is passed instead of string:
102 The error can be avoided by choosing the __toString magix method as follows: */
103
104class stringable
105{
106  function __toString() {
107    return "Hello, world";
108  }
109}
110$obj_string = new stringable;
111
112class needle
113{
114  function __toString() {
115    return "world";
116  }
117}
118$obj_needle = new needle;
119
120var_dump( strpos("$obj_string", "$obj_needle") );
121
122echo "\n-- Passing an array as string and needle --\n";
123$needles = array("hello", "?world", "!$%**()%**[][[[&@#~!");
124var_dump( strpos($needles, $needles) );	 // won't work
125var_dump( strpos("hello?world,!$%**()%**[][[[&@#~!", "$needles[1]") );	// works
126var_dump( strpos("hello?world,!$%**()%**[][[[&@#~!", "$needles[2]") );	// works
127
128
129echo "\n-- Passing Resources as string and needle --\n";
130$resource1 = fopen(__FILE__, "r");
131$resource2 = opendir(".");
132var_dump( strpos($resource1, $resource1) );
133var_dump( strpos($resource1, $resource2) );
134
135echo "\n-- Posiibilities with null --\n";
136var_dump( strpos("", NULL) );
137var_dump( strpos(NULL, NULL) );
138var_dump( strpos("a", NULL) );
139var_dump( strpos("/x0", "0") );	 // Hexadecimal NUL
140
141echo "\n-- A longer and heredoc string --\n";
142$string = <<<EOD
143abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
144abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
145abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
146abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
147abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
148abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
149abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
150abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
151abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
152abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789
153EOD;
154var_dump( strpos($string, "abcd") );
155var_dump( strpos($string, "abcd", 72) );  // 72 -> "\n" in the first line
156var_dump( strpos($string, "abcd", 73) );  // 73 -> "abcd" in the second line
157var_dump( strpos($string, "9", (strlen($string)-1)) );
158
159echo "\n-- A heredoc null string --\n";
160$str = <<<EOD
161EOD;
162var_dump( strpos($str, "\0") );
163var_dump( strpos($str, NULL) );
164var_dump( strpos($str, "0") );
165
166
167echo "\n-- simple and complex syntax strings --\n";
168$needle = 'world';
169
170/* Simple syntax */
171var_dump( strpos("Hello, world", "$needle") );  // works
172var_dump( strpos("Hello, world'S", "$needle'S") );  // works
173var_dump( strpos("Hello, worldS", "$needleS") );  // won't work
174
175/* String with curly braces, complex syntax */
176var_dump( strpos("Hello, worldS", "${needle}S") );  // works
177var_dump( strpos("Hello, worldS", "{$needle}S") );  // works
178
179
180echo "\n-- complex strings containing other than 7-bit chars --\n";
181$str = chr(0).chr(128).chr(129).chr(234).chr(235).chr(254).chr(255);
182echo "-- Positions of some chars in the string '$str' are as follows --\n";
183echo chr(128)." => ";
184var_dump( strpos($str, chr(128)) );
185echo chr(255)." => ";
186var_dump( strpos($str, chr(255), 3) );
187echo chr(256)." => ";
188var_dump( strpos($str, chr(256)) );
189
190echo "\n*** Testing error conditions ***";
191var_dump( strpos($string, "") );
192var_dump( strpos() );  // zero argument
193var_dump( strpos("") );  // null argument
194var_dump( strpos($string) );  // without "needle"
195var_dump( strpos("a", "b", "c", "d") );  // args > expected
196var_dump( strpos($string, "test", strlen($string)+1) );  // offset > strlen()
197var_dump( strpos($string, "test", -strlen($string)-1) );  // offset before start
198var_dump( strpos(NULL, "") );
199
200echo "\nDone";
201
202fclose($resource1);
203closedir($resource2);
204?>
205--EXPECTF--
206*** Testing basic functionality of strpos() ***
207int(0)
208int(5)
209int(5)
210int(3)
211int(10)
212int(2)
213bool(false)
214bool(false)
215bool(false)
216bool(false)
217bool(false)
218int(1)
219
220*** Testing strpos() to find various needles and a long string ***
221Position of 'Hello world' is => int(0)
222Position of 'WORLD' is => bool(false)
223Position of '�' is => int(46)
224Position of '�' is => int(46)
225Position of '�0' is => int(58)
226Position of 'abcd' is => int(48)
227Position of 'xyz' is => int(54)
228Position of 'octal' is => int(61)
229Position of '-3' is => int(19)
230Position of '-3' is =>
231Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
232bool(false)
233Position of '-3.344' is => int(19)
234Position of '-3.344' is =>
235Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
236bool(false)
237Position of '' is =>
238Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
239int(46)
240Position of 'NULL' is => int(31)
241Position of '0' is => int(12)
242Position of '0' is =>
243Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
244int(46)
245Position of '1' is =>
246Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
247bool(false)
248Position of 'TRUE' is => int(36)
249Position of '1' is => int(13)
250Position of '1' is =>
251Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
252bool(false)
253Position of '' is =>
254Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
255int(46)
256Position of 'FALSE' is => int(41)
257Position of ' ' is => int(5)
258Position of '     ' is => int(26)
259Position of 'b' is => int(49)
260Position of '\n' is => bool(false)
261Position of '
262' is => int(66)
263Position of '12' is => int(13)
264Position of '12twelve' is => bool(false)
265Position of 'Hello world,012033 -3.3445     NULL TRUE FALSE� abcd\xxyz �0 octal
266
267abcd$:Hello world' is => int(0)
268
269*** Testing strpos() with possible variations in offset ***
270Position of 'Hello' with offset '1' is => int(74)
271Position of 'Hello' with offset 'string' is =>
272Warning: strpos() expects parameter 3 to be int, string given in %s on line %d
273NULL
274Position of 'Hello' with offset '' is => int(0)
275Position of 'Hello' with offset '' is =>
276Warning: strpos() expects parameter 3 to be int, string given in %s on line %d
277NULL
278Position of 'Hello' with offset '12string' is =>
279Notice: A non well formed numeric value encountered in %s on line %d
280int(74)
281Position of 'Hello' with offset '0' is => int(0)
282Position of 'Hello' with offset '1' is => int(74)
283Position of 'Hello' with offset '' is => int(0)
284Position of 'Hello' with offset '' is => int(0)
285Position of 'Hello' with offset 'string12' is =>
286Warning: strpos() expects parameter 3 to be int, string given in %s on line %d
287NULL
288Position of 'Hello' with offset '12.3string' is =>
289Notice: A non well formed numeric value encountered in %s on line %d
290int(74)
291Position of 'Hello' with offset '-10' is => bool(false)
292Position of 'Hello' with offset '-15' is => int(74)
293Position of 'Hello' with offset '-85' is => int(0)
294
295*** Testing Miscelleneous input data ***
296-- Passing objects as string and needle --
297int(7)
298
299-- Passing an array as string and needle --
300
301Warning: strpos() expects parameter 1 to be string, array given in %s on line %d
302NULL
303int(5)
304int(12)
305
306-- Passing Resources as string and needle --
307
308Warning: strpos() expects parameter 1 to be string, resource given in %s on line %d
309NULL
310
311Warning: strpos() expects parameter 1 to be string, resource given in %s on line %d
312NULL
313
314-- Posiibilities with null --
315
316Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
317bool(false)
318
319Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
320bool(false)
321
322Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
323bool(false)
324int(2)
325
326-- A longer and heredoc string --
327int(0)
328int(73)
329int(73)
330int(728)
331
332-- A heredoc null string --
333bool(false)
334
335Deprecated: strpos(): Non-string needles will be interpreted as strings in the future. Use an explicit chr() call to preserve the current behavior in %s on line %d
336bool(false)
337bool(false)
338
339-- simple and complex syntax strings --
340int(7)
341int(7)
342
343Notice: Undefined variable: needleS in %s on line %d
344
345Warning: strpos(): Empty needle in %s on line %d
346bool(false)
347int(7)
348int(7)
349
350-- complex strings containing other than 7-bit chars --
351-- Positions of some chars in the string '�������' are as follows --
352� => int(1)
353� => int(6)
354� => int(0)
355
356*** Testing error conditions ***
357Warning: strpos(): Empty needle in %s on line %d
358bool(false)
359
360Warning: strpos() expects at least 2 parameters, 0 given in %s on line %d
361NULL
362
363Warning: strpos() expects at least 2 parameters, 1 given in %s on line %d
364NULL
365
366Warning: strpos() expects at least 2 parameters, 1 given in %s on line %d
367NULL
368
369Warning: strpos() expects at most 3 parameters, 4 given in %s on line %d
370NULL
371
372Warning: strpos(): Offset not contained in string in %s on line %d
373bool(false)
374
375Warning: strpos(): Offset not contained in string in %s on line %d
376bool(false)
377
378Warning: strpos(): Empty needle in %s on line %d
379bool(false)
380
381Done
382