|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[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 PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Oct 24 22:00:02 2025 UTC |
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.