Edit report at https://bugs.php.net/bug.php?id=50434&edit=1

 ID:                 50434
 Comment by:         olafvdspek at gmail dot com
 Reported by:        mail at daniel-faber dot de
 Summary:            add string functions str_startswith and str_endswith
                     for convenience
 Status:             Analyzed
 Type:               Feature/Change Request
 Package:            Strings related
 PHP Version:        5.2.11
 Block user comment: N
 Private report:     N

 New Comment:

Please?

http://stackoverflow.com/questions/834303/php-startswith-and-endswith-functions

Requests for these functions come up again and again.
Case insensitive variants might be useful too.


Previous Comments:
------------------------------------------------------------------------
[2012-08-20 21:01:08] ajf at ajf dot me

I would also like to see this. It's very handy for string checking. Both Python 
and C# have such a method. (accompanied by Python's in, it's very handy) For 
brevity I'd prefer startswith() and endswith(), however.

I think I'll write a patch :)

------------------------------------------------------------------------
[2009-12-10 13:19:38] mail at daniel-faber dot de

Possible problems with the above corner cases are not the main reasons why I 
requested these functions.  Even if I know this corner cases will not occur in 
my application I'll prefer str_startswith($s, $p) to substr($s, 0, strlen($p)) 
== $p because it's shorter and easier to read.

This functionality is so often needed and when you need it, you have do use the 
substr expression or define you own str_startswith function.  So why not adding 
it to the PHP core since it's such a basic thing...

------------------------------------------------------------------------
[2009-12-10 00:58:48] mail at daniel-faber dot de

rasmus, this is right in nearly all cases, but here are some corner cases where 
your code fails:

startswith('', '0')
should be false, but your code gives true
reason: substr('', 0, 1)  is  false
        false == '0'  is  true

if you try to fix this by replacing == with ===, another corner case will fail:

startswith('', '')
should be true, but will be false
reason: substr('', 0, 0)  is  false
        false === ''  is  false

this seems to work in all cases:

function str_startswith($string, $prefix) {
        if (strlen($string) < strlen($prefix))
                return false;
        return substr($string, 0, strlen($prefix)) == $prefix;
}


similar for endswith:

endswith('', '0')  should be false, but is true
endswith('test', '')  should be true, but is false

this seems to work in all cases:

function str_endswith($string, $suffix) {
        $suffixLength = strlen($suffix);
        if ($suffixLength == 0)
                return true;
        if (strlen($string) < $suffixLength)
                return false;
        return substr($string, -$suffixLength) == $suffix;
}

------------------------------------------------------------------------
[2009-12-09 23:48:49] ras...@php.net

Isn't it super trivial given the way substr works in PHP?

startswith:
substr($haystack,0,strlen($prefix)) == $prefix

endswith:
substr($haystack,-strlen($suffix)) == $suffix

Usually we add things to core that can't be done with a single trivial 
call in PHP.  The only thing you save is the strlen call, and you can 
hardcode that to avoid it.



------------------------------------------------------------------------
[2009-12-09 23:39:58] mail at daniel-faber dot de

Description:
------------
Please add these two string functions for convenience:

boolean str_startswith($string, $prefix)
// true if $string starts with $prefix, false otherwise

boolean str_endswith($string, $suffix)
// true if $string ends with $suffix, false otherwise

Of course one can easily write these functions in PHP, but having them in the 
PHP core would be nice.  You find them in other languages too:

Java: string.startsWith(prefix) and string.endsWith(suffix)
Python: string.startswith(prefix) and string.endswith(suffix)



------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=50434&edit=1

Reply via email to