помогите с регуляркой
Составляю выражение для текста вида
to [Login 1] to [Login 2] произвольный текст Блоков "to [Login]" может быть любое кол-во, в том числе 0. Нужно вытащить логины и текст сообщения. Написал выражение ^(to \[([\w\s]*)\]\s*)*(.*)$Если его применить к указанному тексту, результат будет такой: 0: (to [Login 1] to [Login 2] произвольный текст) 1: (to [Login 2] ) 2: (Login 2) 3: (произвольный текст) Почему в результаты попадает только второй (нас самом деле последний) блок "to [Login]"? Если выражение заменить на ^(to \[([\w\s]*)\]\s*)(to \[([\w\s]*)\]\s*)(.*)$то есть повторить первую скобку, результат будет тем, который и нужен, но только для двух блоков. 0: (to [Login 1] to [Login 2] произвольный текст) 1: (to [Login 1] ) 2: (Login 1) 3: (to [Login 2] ) 4: (Login 2) 5: (произвольный текст) |
PHP solution:
$subject = "to [Login 1] to [Login 2] to [Login 3] to [Login 4] произвольный текст"; # Логины preg_match_all('/(to \[([^]]+)\])+/', $subject, $matches); foreach($matches[2] as $key => $val) print "<br>$val"; # Произвольный текст preg_match_all('/\]([^]]*$)/', $subject, $matches); print "<br>".$matches[1][0]; Результат: Login 1 Login 2 Login 3 Login 4 произвольный текст |
Часовой пояс GMT +3, время: 02:19. |