Req #78821 [Opn->Sus]: strbrk should accept a $length parameter
| From: | cmb@php.net | Date: | Wed, 13 Jan 2021 11:30:10 +0000 |
| Subject: | Req #78821 [Opn->Sus]: strbrk should accept a $length parameter | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-231532@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=78821&edit=1
ID: 78821
Updated by: cmb@php.net
Reported by: jerry at jmweb dot net
Summary: strbrk should accept a $length parameter
-Status: Open
+Status: Suspended
Type: Feature/Change Request
Package: Strings related
Operating System: n/a
PHP Version: Irrelevant
Block user comment: N
Private report: N
New Comment:
This needs discussion, for which this bug tracker is not suitable.
Feel free to pursue the RFC process[1]. For the time being, I'm
suspending this ticket.
[1] <https://wiki.php.net/rfc/howto>
Previous Comments:
------------------------------------------------------------------------
[2019-11-16 11:56:51] 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.
------------------------------------------------------------------------
[2019-11-16 00:10:59] 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 00:00:26] 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
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=78821&edit=1