$re = '/\[\s*(?P<ID>\S+)\s+(?P<TYPE>\S+)\s+(?P<DATA1>\S+)\s*(?P<DATA2>\S+)?\s*\]/m';
$str = ' 1
2 sadf
3 adf
4 dfa
5 sdfasfasdfasdfa sfa
6 dfas
7 dfa
8 dfd
9 f
10 df
11
12
13 -----------
14
15 [tag image https://google.com/image.png this is some caption ahahahahaadf
16 sdfia sdf asdflakd alksdja ld;jfkadfl;ka dfalkj fa;lsd jaldfkja
17 dsadsf;lkjsadf ladjfa sdfljasd flkjas lakdj alsdjfa sdlfkja ljk sflj]
18
19 [tag url https://google.com/image.png this is some caption ahahahahaadf
20 sdfia sdf asdflakd alksdja ld;jfkadfl;ka dfalkj fa;lsd jaldfkja
21 dsadsf;lkjsadf ladjfa sdfljasd flkjas lakdj alsdjfa sdlfkja ljk sflj]
22
23 [tag quote this is some caption ahahahahaadf
24 sdfia sdf asdflakd alksdja ld;jfkadfl;ka dfalkj fa;lsd jaldfkja
25 dsadsf;lkjsadf ladjfa sdfljasd flkjas lakdj alsdjfa sdlfkja ljk sflj';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php