|
Posted by Csaba Gabor on 06/14/06 12:52
Rik wrote:
> Csaba Gabor wrote:
> > Suppose I want to check that a string, $str, starts with at least the
> > first 3 letters of a given word, say "delete". Can I do that
> > compactly with a regular expression? The following are not my idea
> > of compact:
> >
> > preg_match("/^del(|e|et|ete)\\b/i", $str)
> > Quadratic in the length of the given word
> >
> > preg_match("/^del(e(t(e)?)?)?\\b/i", $str)
> > Really now. But at least it's linear
> >
> Euhm, why at LEAST 3?
> You don't seem to be using 'more' matches.
> Or is this just a quick example?
Yes, just a quick example. It came about as a way to detect certain
command line options. A person should be able to abbreviate any
command line option (such that the abbreviation is still uniquely
applicable (e.g. 'deleg' cannot abbreviate 'delete', and if 'define' is
another option then 'de' cannot abbreviate 'delete' nor 'define')).
> Normally, I wouldn't use regexes for this. The way you made them is about as
> compact as they get for this particular purpose.
>
> if(substr($str,0,3) = substr($needle,0,3){
> //code...
> }
>
> If you're trying to do what I think you want, maybe this is the code for you:
> $needle = 'delete';
> preg_match("/^[a-z]+\b/i", $str,$match);
> if(strlen($match[0])>=3 && $match[0]==substr($needle,0,strlen($match[0]))){
> //code if it matches
> }
>
> By no means shorter, but a lot more versatile.
Thanks for the response. It's what I also came up with (with some
lower casing), but it struck me as a lot of code to do something fairly
trivial.
function abbreviates($needle, $haystack) {
// returns the first word in $haystack if it is $needle or
// an abbreviation. Otherwise returns "". Case insensitive
if (!preg_match("/^\\s*(\\w+)\\b/", $haystack, $match)) return "";
return strcasecmp($m=$match[1],substr($needle,0,strlen($m)))
? "" : $m; }
Csaba
[Back to original message]
|