Bug->Doc #73913 [Asn->Opn]: broken strrpos with negative offset

From: Date: Fri, 13 Jan 2017 15:46:35 +0000
Subject: Bug->Doc #73913 [Asn->Opn]: broken strrpos with negative offset
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-14336@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: Assigned +Status: Open -Type: Bug +Type: Documentation Problem Package: Strings related Operating System: macOS Sierra 10.12.1 PHP Version: 5.6.29 Assigned To: heiglandreas Block user comment: N Private report: N New Comment: The current implementation is mathematically correct and is the same as f.e. the implementation in Java and other programming languages. The docs are misleading here. The negative offset specifies the last offset in the string the needle can start. Therefore the results are correct. Though the documentation of that feature needs some work to explicitly state that and make that more clear. Previous Comments: ------------------------------------------------------------------------ [2017-01-12 11:30:39] dima at virtuman dot com 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 > -offset ------------------------------------------------------------------------ [2017-01-12 10:33:07] dima at virtuman dot com Looks like the problem is related to https://github.com/php/php-src/blob/PHP-5.6.29/ext/standard/string.c#L1987 replace this one: e = haystack + haystack_len + offset; with this one: e = haystack + haystack_len + offset - needle_len; will solve the problem. ------------------------------------------------------------------------ [2017-01-11 21:57:27] heiglandreas@php.net 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. ------------------------------------------------------------------------ [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 ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=73913 -- Edit this bug report at https://bugs.php.net/bug.php?id=73913&edit=1

« previous php.doc.bugs (#14336) next »