2013-03-11 4 views
1

Я пытаюсь получить все сопоставленные шаблоны из списка слов;preg_match соответствует всем стартовым словам

$pattern = '/^(ab|abc|abcd|asdf)/'; 
preg_match_all($pattern, 'abcdefgh', $matches); 

Я хочу, чтобы получить 'аб, ABC и абвг'

Но это возвращение только 'аб'. Он работает, если я прокручиваю шаблоны после их взрыва.

Есть ли способ решить проблему, хотя один матч?

ответ

2

Регулярные выражения потребляют символы, поскольку они соответствуют строке, поэтому они не могут найти совпадающие совпадения.

Вы можете использовать расширенные функции, такие как упреждающее утверждение вместе с capturings групп, но это требует уродливой конструкции:

preg_match_all(
    '/^ 
    (?:(?=(ab)))? 
    (?:(?=(abc)))? 
    (?:(?=(abcd)))? 
    (?:(?=(asdf)))? 
    /x', 
    $subject, $result, PREG_SET_ORDER); 
for ($matchi = 0; $matchi < count($result); $matchi++) { 
    for ($backrefi = 0; $backrefi < count($result[$matchi]); $backrefi++) { 
     # Matched text = $result[$matchi][$backrefi]; 
    } 
} 
Смежные вопросы