php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Request #78821 strbrk should accept a $length parameter
Submitted: 2019-11-16 00:00 UTC Modified: 2019-11-16 11:56 UTC
From: jerry at jmweb dot net Assigned:
Status: Open Package: Strings related
PHP Version: Irrelevant OS: n/a
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2019-11-16 00:00 UTC] jerry at jmweb dot net
Description:
------------
Sometimes we just need to know if a single character, among a list of characters, exists in a string. strbrk() is almost what is needed but instead it returns a substring of the original starting from the first occurrence.

Admittedly, I am not a C person but inspecting the source code indicates that this feature should be trivial. Here is what I propose the new signature should be:

strpbrk ( string $haystack , string $char_list [, int $length ] ) : string;

If $length is given and is positive, the string returned will contain at most $length characters.

If I follow correctly, "RETURN_STRINGL" ends up calling "zend_string_init" which accepts a "len" parameter as its second argument. How difficult would it be to add this feature?

https://github.com/php/php-src/blob/93ba3abe63cd339c52cf5774e948bb35d8e73049/ext/standard/string.c#L6078


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2019-11-16 00:10 UTC] requinix@php.net
-Status: Open +Status: Feedback
 [2019-11-16 00:10 UTC] requinix@php.net
I'm not sure I understand. Doesn't a $length imply that strpbrk will only check the first $length characters of $haystack? How does that help your use case of checking "if a single character, among a list of characters, exists in a string"?

Instead, have you seen strcspn? https://3v4l.org/G3orE
 [2019-11-16 11:56 UTC] jerry at jmweb dot net
-Status: Feedback +Status: Open
 [2019-11-16 11:56 UTC] jerry at jmweb dot net
My objective was to avoid introducing a new core function by enhancing an existing function in a BC way. strpbrk() seemed to fit the bill neatly. The description of $length was borrowed from substr() which, if positive, indicates the maximum length of the returned string. If strpbrk() is enhanced as recommended, then I would implement as follows:

if( strlen( strpbrk( $string, $allowed, 1 ) ) ){ /* .. do something */}

Here is an example of a userland implementation (https://3v4l.org/cp19M) but the obvious benefit of implementing at the core level is to avoid returning the remaining segment of the string once a character is found.

Thank you for pointing out strcspn(). Based on your example, the inline implementation is similar, albeit longer, to the strpbrk() variant shown above:

if( strcspn( $string, $allowed ) < strlen( $string ){ /* .. do something */}

To cover edge cases, I wrapped it up and added it to my library (https://3v4l.org/0C6sQ).

Thanks.
 
PHP Copyright © 2001-2020 The PHP Group
All rights reserved.
Last updated: Wed Nov 25 00:01:23 2020 UTC