[support] preg_match failes where egrep and PERL succeed?

Luke drupal at lists.tacticus.com
Thu Feb 4 07:58:05 UTC 2010


(Solved!  See below for details.)

On Wed, 3 Feb 2010, CM Lubinski wrote:

> I think this is an issue with your escaping but my eyes are not keen
> enough to see where the error is.

Moving the code into an include, and running:

drush 2> /dev/null eval 'include("/tmp/drupal.inc");'

Gets me a no-matcher.

> The regular expression itself works fine:
> <?php
>  function get_matches($to_match) {
>    preg_match('/^\d{3}\|([0-9a-fA-F]+)/', $to_match, $match);

That assumes a single search string.  I hardcoded the "200" where you 
have "\d+", because what actually happens is that the three digit code is 
obtained on the fly from a variable.  So the regex is to search a group of 
lines with that format, and when it gets to the one containing "200" at 
the start, kick back the second part.

I tried it with your version, though, and it returned the first line's 
RHS, as I would expect--1 match.

I've just figured it out.  The difference between the greps and 
PCRE, is that in the greps, the data is taken on a line by line basis. 
So, ^ matches the start of a line.
PCRE is not treating newline specially, so ^ and $ apply to the beginning 
and end of the entire pattern space.

Rewriting it with:

$res = preg_match('/\b' . $search_for . '\|([0-9a-fA-F]{6})/',
$match_against, $match);

gets the job done.

Thanks for considering it.

Luke


More information about the support mailing list