Req #78821 [Opn->Sus]: strbrk should accept a $length parameter

From: 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

« previous php.bugs (#231532) next »