Re: Character range syntax ".." for character masks

From: Date: Fri, 29 Jul 2022 08:58:35 +0000
Subject: Re: Character range syntax ".." for character masks
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-118308@lists.php.net to get a copy of this message
On Fri, Jul 29, 2022 at 7:15 AM mickmackusa <mickmackusa@gmail.com> wrote: > > > On Monday, July 25, 2022, Guilliam Xavier <guilliam.xavier@gmail.com> > wrote: > >> On Sat, Jul 9, 2022 at 1:56 AM mickmackusa <mickmackusa@gmail.com> wrote: >> >>> I've discovered that several native string functions offer a character >>> mask >>> as a parameter. >>> >>> I've laid out my observations at >>> https://stackoverflow.com/q/72865138/2943403 >>> >> >> Out of curiosity, why do you say that strtr() is "not a good candidate >> because character order matters" (although you give a reasonable example)? >> Maybe you have some counter-example? >> >> Regards, >> >> -- >> Guilliam Xavier >> > > I prefer to keep my scope very tight when posting on Stack Overflow. > > My focus was purely on enabling character range syntax for native > functions with character mask parameters. My understanding of character > masks in PHP requires single-byte characters and no meaning to character > order. > > When strtr() is fed two strings, they cannot be considered "character > masks" because the character orders matter. > > If extending character range syntax to parameters which are not character > masks, I might support the feature for strtr(), but ensuring that the two > strings are balanced will be made more difficult with ranged syntax. > strtr() will silently condone imbalanced strings. > https://3v4l.org/PY15F > Thanks for the clarifications. You're right that the internal php_charmask converts a character list (possibly containing one or more ranges) into a 256-char *mask*, thus "losing" any original order; so strtr() actually couldn't use the same implementation (even without ranges), and a counter-example is strtr('adobe', 'abcde', 'ebcda') (strtr('adobe', 'a..e', 'e..a') would trigger a Warning "Invalid '..'-range, '..'-range needs to be incrementing"). I had seen a parallel with the Unix tr command, which *does* support [incrementing] ranges (e.g. both echo adobe | tr abcde ABCDE and `echo adobe | tr a-e A-E give "ADoBE", while echo adobe | tr abcde edcba` gives "eboda" but echo adobe | tr a-e e-a errors "range-endpoints of 'e-a' are in reverse collating sequence order"), but its implementation doesn't use character masks indeed ( https://github.com/coreutils/coreutils/blob/master/src/tr.c), and `echo abracadabra | tr a-f x` gives "xxrxxxxxxrx" not "xbrxcxdxbrx"; and it also supports more things like POSIX character classes... PS: I find the strtr(string $string, array $replace_pairs) form generally superior to the strtr(string $string, string $from, string $to) one anyway ;) Regards, -- Guilliam Xavier

« previous php.internals (#118308) next »