REGEX: grouping of alternative patterns

From: 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

« previous php.general (#263806) next »