Bug #73913 [Nab->Opn]: broken strrpos with negative offset
| From: | heiglandreas@php.net | Date: | Wed, 11 Jan 2017 21:57:28 +0000 |
| Subject: | Bug #73913 [Nab->Opn]: broken strrpos with negative offset | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-206543@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=73913&edit=1
ID: 73913
Updated by: heiglandreas@php.net
Reported by: proartex at mail dot ru
Summary: broken strrpos with negative offset
-Status: Not a bug
+Status: Open
Type: Bug
Package: Strings related
Operating System: macOS Sierra 10.12.1
PHP Version: 5.6.29
Block user comment: N
Private report: N
New Comment:
Looks like you're right! I dug deeper into it and it seems there is an issue when the negative
offset is smaller or equals the size of the needle.
I'm digging deeper into it.
Previous Comments:
------------------------------------------------------------------------
[2017-01-11 18:03:34] proartex at mail dot ru
1. Does strrpos("works_like_a_charm", 'charm', 15) really equals to
strrpos("works_like_a_charm", 'charm', -3)? false != 13. It is also applicable
for 3 last cases.
------------------------------------------------------------------------
[2017-01-11 17:32:03] heiglandreas@php.net
when offset is negative the search *starts* that many characters *from the end*. The search is not
excluding the last n characters.
strrpos("aaaa", 'aa', -2) == strrpos("aaaa", 'aa', 2)
strrpos("aaaa", 'a', -1) == strrpos("aaaa", 'a', 3)
strrpos("/documents/show/5474", '/', -20) ==
strrpos("/documents/show/5474", '/', 0)
strrpos("works_like_a_charm", 'charm', -3) ==
strrpos("works_like_a_charm", 'charm', 15)
strrpos("works_like_a_charm", 'charm', -4) ==
strrpos("works_like_a_charm", 'charm', 14)
So they work as expected.
What you want to do would be achieved by this:
strrpos(substr("aaaa", -2), "aa");
When needle is longer than the remaining string, the offset seems to be expanded to at least include
the needle.
Note also the comment on http://php.net/manual/de/function.strrpos.php#76447
------------------------------------------------------------------------
[2017-01-11 17:19:23] proartex at mail dot ru
last case must be var_dump(strrpos("works_like_a_charm", 'charm', -5)); //ER:
false, AR: 13
------------------------------------------------------------------------
[2017-01-11 17:16:36] proartex at mail dot ru
Description:
------------
It is seems broken at least in the following cases:
- if negative offset equals to haystack length;
- if negative offset less than needle length;
- if needle length equals to (haystack length + negative offset)
Negative offset should not move pointer but reduce search scope on the value of offset. In that case
character placed at 0 position must not be found if search scope is reduced to empty string. Same
should be applied in boundary cases: character placed next to reduced search scope must not be found
(last case).
Test script:
---------------
<?php
var_dump(strrpos("aaaa", 'aa', -2)); //ER: 0, AR: 2
var_dump(strrpos("aaaa", 'a', -1)); //ER: 2, AR: 3
var_dump(strrpos("/documents/show/5474", '/', -20)); //ER: false, AR: 0
var_dump(strrpos("works_like_a_charm", 'charm', -3)); //ER: false, AR: 13
var_dump(strrpos("works_like_a_charm", 'charm', -4)); //ER: false, AR: 13
Expected result:
----------------
0
2
false
false
false
Actual result:
--------------
2
3
0
13
13
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=73913&edit=1