preg_match возвращает одинаковые элементы только один раз

Я прохожу через строку и обрабатывает все элементы между! – и – !. Но только уникальными элементами являются процессы. Когда у меня есть! – пример …! и еще немного в тексте! – example– !, второй – игнорируется.

Это код:

while ($do = preg_match("/!--(.*?)--!/", $formtext, $matches)){ 

Я знаю о preg_match_all, но нужно сделать это с помощью preg_match.

Любая помощь? Заранее спасибо!

Вы хотите, чтобы PHP просматривал совпадения только после предыдущего совпадения. Для этого вам нужно будет зафиксировать смещения строк, используя флаг PREG_OFFSET_CAPTURE.

Пример:

 $offset = 0; while (preg_match("/!--(.*?)--!/", $formtext, $match, PREG_OFFSET_CAPTURE, $offset)) { // calculate next offset $offset = $match[0][1] + strlen($match[0][0]); // the parenthesis text is accessed like this: $paren = $match[1][0]; } 

Для получения дополнительной информации см. Документацию preg_match .

Использовать preg_match_all

edit : некоторые уточнения дают:

 $string = '!--example--! asdasd !--example--!'; //either this: $array = preg_split("/!--(.*?)--!/",$string,-1,PREG_SPLIT_DELIM_CAPTURE); var_dump($array); array(5) { [0]=> string(0) "" [1]=> string(7) "example" [2]=> string(10) " asdasd " [3]=> string(7) "example" [4]=> string(0) "" } //or this: $array = preg_split("/(!--(.*?)--!)/",$string,-1,PREG_SPLIT_DELIM_CAPTURE); var_dump($array); array(7) { [0]=> string(0) "" [1]=> string(13) "!--example--!" [2]=> string(7) "example" [3]=> string(10) " asdasd " [4]=> string(13) "!--example--!" [5]=> string(7) "example" [6]=> string(0) "" } 

while ($do = preg_match("/[!--(.*?)--!]*/", $formtext, $matches)){

Укажите * в конце шаблона, чтобы указать более одного. Они должны быть добавлены в ваш массив $ matches.