By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
429,084 Members | 1,956 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 429,084 IT Pros & Developers. It's quick & easy.

RegExp for a substring

P: n/a
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
Thanks.
Csaba Gabor from Vienna

Jun 14 '06 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Rik
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?

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.

Grtz,
--
Rik Wasmus
Jun 14 '06 #2

P: n/a
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

Jun 14 '06 #3

P: n/a
Csaba Gabor wrote:
Rik wrote:
Csaba Gabor wrote:

What it seems that you're trying to achieve is similar to REXX's ABBBREV
function. This takes 3 arguments thus:

Abbrev( information, info [, length ] ] )

information -- reference string
The string that may start with the abbreviated text value.

info -- test substring
The abbreviated text value.

length -- minimal substring length
The minimal required length of the test substring -- the default minimum
length is 0 !

Which I would solve like this:

function abbrev($full,$part,$len=0) {
return !(strlen($part)<$len || substr($full,0,strlen($part)) !== $part);
}
Jun 14 '06 #4

This discussion thread is closed

Replies have been disabled for this discussion.