$re = '/((C1)(.*?))?((C2)(.*?))?((C3)(.*?))?((C4)(.*?))?(\.zip|$)/m';
$str = 'C1 Anything, Notice How The Groups Are Always The Same C2 Anything C3 Anything C4 Anything.zip
C1 Anything, The Same No Matter Which C\'s Are Present C2 Anything C3 Anything C4 Anything.zip
C1 Anything, This One Is An Example Of No Extension C4 Anything
C1 Anything, The File Extension Is Always Group 13 C3 Anything.zip
C2 Anything, This One Starts With "C2" C3 Anything.zip
C3 Anything, And This One Starts With "C3" C4 Anything.zip
Group 2 is always C1 and anything after is always Group 3
Group 5 is always C2 and anything after is always Group 6
Group 8 is always C3 and anything after is always Group 9
Group 11 is always C4 and anything after is always Group 12
Group 13 (the file extension) is always .zip
But, is there a way of stopping group 13 matching with the end of every line whilst still maintaining this group structure?';
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