$re = '/^\w+(?:#\d+)*(?:\.\w+(?:#\d+)*)*$/m';
$str = 'document.
document.role.
.document
docum#ent.role.id
document.role.#id
docu#1ment.role.id
document.ro#0#1le.id
document.role.id
document.role.id.and.other.very.long.path.example
document.role#0.id
document#1.role#0.id
document#1.role#0#1.id
document#1.role#0#1.id#21';
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