|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2017-01-11 17:16 UTC] 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
PatchesPull Requests
Pull requests:
HistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 05:00:02 2025 UTC |
last case must be var_dump(strrpos("works_like_a_charm", 'charm', -5)); //ER: false, AR: 13when 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#764471. 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.my previous comment is not absolutely right. I'm not sure why those conditions are needed: if (needle_len > -offset) { e = haystack + haystack_len - needle_len; } else { e = haystack + haystack_len + offset; } In all cases we need to subtract absolute value of offset from e pointer and also subtract value of needle length. There is no reason to check needle_len > -offsetJava implementation has no negative fromIndex for "public int lastIndexOf(String str, int fromIndex)". Java implementation returns "-1" for any negative fromIndex. There is an examples from python: " >>> 'aaaa'.rfind('a',0, -2) 1 >>> 'aaaa'.rfind('a', 0, -1) 2 >>> '/documents/show/5474'.rfind('/', 0, -20) -1 >>> 'works_like_a_charm'.rfind('charm', 0, -3) -1 >>> 'works_like_a_charm'.rfind('charm', 0, -5) -1 " It works the way we expect> Java implementation has no negative fromIndex for "public int > lastIndexOf(String str, int fromIndex)". If the offset is negative, strrpos($haystack, $needle, $offset) behaves like String.lastIndexOf(needle, -offset). > It works the way we expect Then you have to adjust your expectations. :) Or, your code. For instance: strrpos('works_like_a_charm', 'charm', -3 - strlen('charm')); // false