REGEX: grouping of alternative patterns
| From: | Stijn Verholen | Date: | Tue, 30 Oct 2007 11:07:26 +0000 |
| Subject: | REGEX: grouping of alternative patterns | ||
| Groups: | php.general | ||
| Request: | Send a blank email to php-general+get-263806@lists.php.net to get a copy of this message | ||
Hey list,
I'm having problems with grouped alternative patterns.
The regex I would like to use, is the following:
/\s*(
?.+?)\s*int\s*(\(([0-9]+)\))?\s*(unsigned)?\s*(((auto_increment)?\s*(primary\s*key)?)|((not\s*null)?\s*(default\s*(.*|[0-9]*)?)?))\s*/i
It matches this statement:
id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY
But not this:
test4 INT(11) UNSIGNED NOT NULL DEFAULT 5
However, if I switch the alternatives, the first statement doesn't match, but the second does.
FYI: In both cases, the column name and data type are matched, as expected.
It appears to be doing lazy evaluation on the pattern, even though every resource I can find states that every alternative is tried in turn until a match is found.
Any ideas on how this can be resolved would be greatly appreciated.
Here is some code:
<?php
$pattern1 = '/\s*(?.+?)\s*int\s*(\(([0-9]+)\))?\s*(unsigned)?\s*(((auto_increment)?\s*(primary\s*key)?)|((not\s*null)?\s*(default\s*(.*|[0-9]*)?)?))\s*/i';
$pattern2 = '/\s*(?.+?)\s*int\s*(\(([0-9]+)\))?\s*(unsigned)?\s*(((not\s*null)?\s*(default\s*(.*|[0-9]*)?)?)|((auto_increment)?\s*(primary\s*key)?))\s*/i';
$column1 = 'id INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY';
$column2 = 'test4 INT(11) UNSIGNED NOT NULL DEFAULT 5';
$matches = array();
preg_match($pattern1, $column1, $matches); print_r($matches); // match
preg_match($pattern1, $column2, $matches); print_r($matches); // doesn't match
preg_match($pattern2, $column1, $matches); print_r($matches); // doesn't match
preg_match($pattern2, $column2, $matches); print_r($matches); // match
?>
Greetz,
Stijn