$re = '/^#start of line
(?![^\n!]*!{2,})
(?=[^_\n]*_[^_]*) #if _ exists, then:
([^_:]+) #mandatory group 1
((?=:[^:\n]):[^:_(\n]+|) #optional group 2
(_(?!_)) #group 3 mandatory
([^_\-(\n]+) # group 4 mandatory
\( #mandatory (
([^()\n]+) # group 5 mandatory
\) #mandatory )
((?=!)!|) # group 6 optional
((?=:[^!:@\n]):[^!:@\n]+|) # group 7 optional
((?=::[^!:@\n])::[^!:@\n]+|) #group 8 optional
((?=@[^!:@\n])@[^!:@\n]+|) #group 9 optional
$ #end of line/mx';
$str = '# OK - Matches all components if all are provided
contextClassName:pc_ruleName(param_One paramTwo)!:pc::pe@media
# OK - Return group 2 blank when no : exists before _ which is group 3
contextClassName_ruleName(param_One paramTwo)!:pc::pe@media
# OK - When ! is not provided return group 6 blank
contextClassName_ruleName(param_One paramTwo):pc::pe@media
# NOTOK - More than one consecutive !
contextClassName_ruleName(param_One paramTwo)!!:pc::pe@media
# NOTOK - 3 More than two : at instruction tail
contextClassName_ruleName(param_One paramTwo):::pe@media
# OK - 2 At instruction tail :: is resolved to group 8
contextClassName_ruleName(param_One paramTwo)::pe@media
# OK - 1 At instruction tail : is resolved to group 7
contextClassName_ruleName(param_One paramTwo):pe@media
# OK - At instruction start : followed by chars
contextClassName:pc_ruleName(param_One paramTwo):pe@media
# NOTOK - At instruction start : not followed by chars
contextClassName:_ruleName(param_One paramTwo):pe@media
# NOTOK - At instruction start :: followed by chars
contextClassName::pc_ruleName(param_One paramTwo):pe@media
# OK - Whole instruction tail is optional
contextClassName:pc_ruleName(param_One paramTwo)
# OK - Parameter value can contain anything
contextClassName:pc_ruleName(param_One param#$^Two)';
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