# New string functions: str_startswith() and str_endswith()

- Thread: https://externals.io/message/39099
- Original archive: https://news-web.php.net/php.internals/39099
- Started by Martin Jansen on 2008-07-19T12:55:57+00:00
- Messages: 14
- Reply by email to internals@lists.php.net
- More for agents: search with https://externals.io/search.md?q={query} · JSON API at https://externals.io/api · documentation at https://externals.io/llms.txt

---

## #39099 — Martin Jansen — 2008-07-19T12:55:57+00:00

URL: https://externals.io/message/39099#39099

Attached you'll find a patch against PHP_5_3 that implements two new
string functions:

str_startswith(haystack, needle [, case_sensitivity])

checks if haystack starts with needle. The check is performed
case-insensitively, but this can be overridden by passing `TRUE` as the
value for the third parameter. The second function

str_endswith(haystack, needle [, case_sensitivity])

checks if haystack ends with needle and has the same semantics
regarding case-sensitivity.

I admit that both functions can be easily implemented in userland with
already existing functions. At the same time I like them because they
make the common tasks of prefix and suffix checks easy and convenient.
I won't mind if you guys don't like the idea (I did it mainly for
personal entertainment and learning about PHP internals), but if you
are interested I'll happily provide a patch for HEAD, too. Also since
this is my first foray into PHP internals, comments and corrections
are more then appreciated.

Martin

---

## #39106 — Lars Strojny — 2008-07-20T00:36:57+00:00

URL: https://externals.io/message/39099#39106 · In reply to: #39099

Hi Martin,

first of all, thanks for you work! A few comments below.

Am Samstag, den 19.07.2008, 14:55 +0200 schrieb Martin Jansen:
> Attached you'll find a patch against PHP_5_3 that implements two new
> string functions:
> 
> str_startswith(haystack, needle [, case_sensitivity])

That's in my opinion too easy to solve with strpos($haystack, $needle)
=== 0.

> checks if haystack starts with needle. The check is performed
> case-insensitively, but this can be overridden by passing `TRUE` as the
> value for the third parameter. The second function
> 
> str_endswith(haystack, needle [, case_sensitivity])
[...]

Suffix checking is indeed a bit harder. But I'm not sure if we should
introduce a function for every special case. Suffix verification often
is about verifying file extensions. That could be easily solved with
 `pathinfo()` (and to make that easier, it would be more helpful to allow
the engine to directly access returned arrays like
pathinfo($file)['extension']). The other thing I would love to see is
something I really love in Ruby: you have various ways to work with
substrings[1]. For example you can do "foobar"[-3,3] == "bar" to check
the suffix. That's in my opinion much easier and flexible.

So -1 from me for the new string functions, but +1 for niftier variants
to work with offsets.

[1] ﻿http://pleac.sourceforge.net/pleac_ruby/strings.html

cu, Lars

---

## #39107 — Rasmus Lerdorf — 2008-07-20T01:32:28+00:00

URL: https://externals.io/message/39099#39107 · In reply to: #39106

For the start of the string:

   substr($haystack,0,strlen($needle)) == $needle

And for the end of the string:

   substr($haystack,-strlen($needle)) == $needle

For case-insensitivity, just strtolower both.

Writing built-in functions for something that can be done with trivial 
one-liners isn't something we typically do.

-Rasmus

Lars Strojny wrote:
> Hi Martin,
>
> first of all, thanks for you work! A few comments below.
>
> Am Samstag, den 19.07.2008, 14:55 +0200 schrieb Martin Jansen:
> > […]
>
> That's in my opinion too easy to solve with strpos($haystack, $needle)
> === 0.
>
> > […]
> [...]
>
> Suffix checking is indeed a bit harder. But I'm not sure if we should
> introduce a function for every special case. Suffix verification often
> is about verifying file extensions. That could be easily solved with
> `pathinfo()` (and to make that easier, it would be more helpful to allow
> the engine to directly access returned arrays like
> pathinfo($file)['extension']). The other thing I would love to see is
> something I really love in Ruby: you have various ways to work with
> substrings[1]. For example you can do "foobar"[-3,3] == "bar" to check
> the suffix. That's in my opinion much easier and flexible.
>
> So -1 from me for the new string functions, but +1 for niftier variants
> to work with offsets.
>
> [1] ﻿http://pleac.sourceforge.net/pleac_ruby/strings.html
>
> cu, Lars

---

## #39113 — Stan Vassilev | FM — 2008-07-20T11:55:01+00:00

URL: https://externals.io/message/39099#39113 · In reply to: #39107

Hi,

Actually starts with and ends with is a very common case. I see your 
concerns, but I can see instantly quite a lot of places in my code where I'd 
use those. And I bet it'll be faster too.

Many of the string functions can be replicated with one-liners using other 
string functions, same for array functions. I still think a very common case 
should be addressed natively.

Regards,
Stan Vassilev

> For the start of the string:
>
>   substr($haystack,0,strlen($needle)) == $needle
>
> And for the end of the string:
>
>   substr($haystack,-strlen($needle)) == $needle
>
> For case-insensitivity, just strtolower both.
>
> Writing built-in functions for something that can be done with trivial 
> one-liners isn't something we typically do.
>
> -Rasmus
>
> Lars Strojny wrote:
> > […]

---

## #39114 — Rasmus Lerdorf — 2008-07-20T14:31:13+00:00

URL: https://externals.io/message/39099#39114 · In reply to: #39113

I agree that many existing functions can be implemented with a 
combination of others, but in this case it is really just one call.  The 
 `strlen()` call is almost free, and in many cases you wouldn't even use 
it.  If you are looking for .php files, for example:

   if(str_endswith($path,'.php'))

vs.

   if(substr($path,-4)=='.php'))

I just don't see that this is solving any real painpoint.

-Rasmus


Stan Vassilev | FM wrote:
>
> Hi,
>
> Actually starts with and ends with is a very common case. I see your
> concerns, but I can see instantly quite a lot of places in my code where
> I'd use those. And I bet it'll be faster too.
>
> Many of the string functions can be replicated with one-liners using
> other string functions, same for array functions. I still think a very
> common case should be addressed natively.
>
> Regards,
> Stan Vassilev
>
> > […]

---

## #39126 — Stan Vassilev | FM — 2008-07-21T12:17:32+00:00

URL: https://externals.io/message/39099#39126 · In reply to: #39114

Hi,

 `ucfirst()` isn't solving a pain point either. But we use it all the time (I 
do at least).

I'm particularly for begins/endswith() function as I do this all over my 
code and I'd appreciate the simplification and free extra performance.

Regards,
Stan Vassilev

>I agree that many existing functions can be implemented with a combination 
>of others, but in this case it is really just one call.  The `strlen()` call 
>is almost free, and in many cases you wouldn't even use it.  If you are 
>looking for .php files, for example:
>
>   if(str_endswith($path,'.php'))
>
> vs.
>
>   if(substr($path,-4)=='.php'))
>
> I just don't see that this is solving any real painpoint.
>
> -Rasmus
>
>
> Stan Vassilev | FM wrote:
> > […]

---

## #39128 — Brian Moon — 2008-07-21T14:47:41+00:00

URL: https://externals.io/message/39099#39128 · In reply to: #39126

Stan Vassilev | FM wrote:
> I'm particularly for begins/endswith() function as I do this all over my
> code and I'd appreciate the simplification and free extra performance.

I really don't mean to be rude here, but shorter and less typing !== 
performance gain.  The PHP string functions are very fast.  And if you 
are looking to improve your applications performance by using different 
string functions, you are likely looking in the wrong place.

-- 

Brian Moon
Senior Web Engineer
------------------------------
When you care enough to spend the very least.
http://dealnews.com/

---

## #39131 — Rasmus Lerdorf — 2008-07-21T16:26:02+00:00

URL: https://externals.io/message/39099#39131 · In reply to: #39128

Brian Moon wrote:
> Stan Vassilev | FM wrote:
> > […]
>
> I really don't mean to be rude here, but shorter and less typing !==
> performance gain. The PHP string functions are very fast. And if you are
> looking to improve your applications performance by using different
> string functions, you are likely looking in the wrong place.

It also isn't any shorter:

   if(str_endswith($path,'.php'))

   vs.

   if(substr($path,-4)=='.php')

And there would be no performance gain since it can be done in a single 
call now and the code would do pretty much exactly what substr does.

-Rasmus

---

## #39140 — Stanislav Malyshev — 2008-07-21T19:08:54+00:00

URL: https://externals.io/message/39099#39140 · In reply to: #39131

Hi!

> It also isn't any shorter:
> 
>   if(str_endswith($path,'.php'))
> 
>   vs.
> 
>   if(substr($path,-4)=='.php')

Doesn't substr allocate new string for ".php"? Then endswith can have 
one advantage of not requiring any new allocations. Not sure it's enough 
to add it, but a point here to consider.
-- 
Stanislav Malyshev, Zend Software Architect
stas@zend.com   http://www.zend.com/
(408)253-8829   MSN: stas@zend.com

---

## #39143 — pstradomski@gmail.com — 2008-07-21T20:06:53+00:00

URL: https://externals.io/message/39099#39143 · In reply to: #39131

W liście Rasmus Lerdorf z dnia poniedziałek, 21 lipca 2008:
> It also isn't any shorter:
>
>    if(str_endswith($path,'.php'))
>
>    vs.
>
>    if(substr($path,-4)=='.php')

Only if comparing to a static string, but not for this case:

if (substr($path, -strlen($extension)) == $extension)

Readability would also increase.

-- 
Paweł Stradomski

---

## #39144 — Jani Taskinen — 2008-07-21T20:14:15+00:00

URL: https://externals.io/message/39099#39144 · In reply to: #39143

Paweł Stradomski kirjoitti:
> W liście Rasmus Lerdorf z dnia poniedziałek, 21 lipca 2008:
> > […]
> 
> Only if comparing to a static string, but not for this case:
> 
> if (substr($path, -strlen($extension)) == $extension)
> 
> Readability would also increase.
>

You people are funny..

--Jani

---

## #39147 — D. Dante Lorenso — 2008-07-21T20:52:28+00:00

URL: https://externals.io/message/39099#39147 · In reply to: #39144

Jani Taskinen wrote:
> Paweł Stradomski kirjoitti:
> > […]
> You people are funny..

I'd like to have such a function in PHP, but when you think about how 
easy it is to create without bloating the PHP core, it's easy enough to 
do without it.  Here's what I do using my own string library:

   if (LS_Util_String :: ends_with($path, '.php')) {
    ...
   }

It's a bit longer, but all my functions are longer for good reason:
http://www.dantescode.com/2007/10/10/evolution-of-php-coder-naming-classes/

-- Dante

---

## #39152 — johannes@php.net — 2008-07-21T21:18:07+00:00

URL: https://externals.io/message/39099#39152 · In reply to: #39143

> W liście Rasmus Lerdorf z dnia poniedziałek, 21 lipca 2008:
> > […]
> 
> Only if comparing to a static string, but not for this case:
> 
> if (substr($path, -strlen($extension)) == $extension)

Then $extension is a CV which isn't that much slower in comparison as a
CONST, so from engine-performance-perspective: no big deal -> spend your
time optimizing on other places where it has more effect than the time
you loose on teaching people about all the fancy string functions (where
we already have more than enough)

> Readability would also increase.

too many functions hurt more on readability imo ...

johannes

---

## #39154 — Brian Moon — 2008-07-21T21:40:18+00:00

URL: https://externals.io/message/39099#39154 · In reply to: #39143

Paweł Stradomski wrote:
> W liście Rasmus Lerdorf z dnia poniedziałek, 21 lipca 2008:
> > […]
>
> Only if comparing to a static string, but not for this case:
>
> if (substr($path, -strlen($extension)) == $extension)
>
> Readability would also increase.
>

In our code base, we have a nice file called string.php that has every 
variation of string functions not covered by the core in it.  We add 
stuff as we need it.  I break strings on the space nearest a given 
length in 80% of all code that runs on my server.  But, I don't expect a 
PHP built in to do it.  If you are worried about performance, you could 
make a PECL Strings package for all the stuff that the core does not do.

Then, your code can be readable and neat like you want.

Hmm, perhaps there is a need for a "standard" (widely used?) PHP 
(non-OO) package that filled in the gaps that the core does not provide. 
  Make it non-OO so that it looks and acts like the core as much as 
possible.  In my "spare time" I will start this. =)

-- 

Brian Moon
Senior Web Engineer
------------------------------
When you care enough to spend the very least.
http://dealnews.com/
