$re = '/^(@(?<scope>[a-z0-9][a-z0-9-]*))\/(?<name>([a-z0-9][a-z0-9-]*)(\/([a-z0-9][a-z0-9-]*))*)$/m';
$str = '
@collboard/foo
@collboard/bar
@collboard/foo/bar
@collboard/foo/bar/foobar
@collboard/1/2/3
@collboard/foo-1/bar-2/foobar-3
@collboard-bar/foo-1/bar-2/foobar-3
collboard
@collboard
/missing-scope
/@collboard
@collboard/
@-collboard/foo
@collboard/-foo
@collboard/foo/
@collboard//foo
@collboard/Foo
@collboard/foo*
@collboard/foo~
@collboard/foo+
@collboard/foo_bar';
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