$re = '/^(?:(?<initial_commit>Initial commit\.?)|(?<merge>Merge [^\r\n]+)|(?<type>build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test|¯\\\\_\(ツ\)_\/¯)(?:\((?<scope>[\w-]+)\))?(?<breaking>!)?: (?<summary>[\w ,\'.`:-]+)(?<=\v\v){0,2}(?<body>[\w\s,\'.`\[\]-]+)(?<footer>(?<=\v\v)(?:(?<footer_token>[\w\s-]+): (?<footer_value>[\w -`]+))+|$))/m';
$str = '--------------
* Should PASS
--------------
Initial commit.
Merge pull request #123 from branch x.y.z :tada:.
¯\\_(ツ)_/¯: commit subject.
# Commit message with description and breaking change footer
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files.
# Commit message with ! to draw attention to breaking change
feat!: send an email to the customer when a product is shipped.
# Commit message with scope and ! to draw attention to breaking change
feat(api)!: send an email to the customer when a product is shipped.
# Commit message with both ! and BREAKING CHANGE footer
chore!: drop support for Node 6
BREAKING CHANGE: use JavaScript features not available in Node 6.
# Commit message with no body
docs: correct spelling of CHANGELOG.
# Commit message with scope
feat(lang): :flag-eg: added `Arabic` language.
# Commit message with multi-paragraph body and multiple footers
refactor(api)!: :checkered_flag: prevent racing conditions of requests of the trusted borwsers.
[patch]
List of the changes, that has been introduced.
- Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.
- Remove timeouts which were used to mitigate the racing issue but are
obsolete now.
BREAKING CHANGE: Upgrading dependencies.
Signed-off-by: Ahmed Kamal <architect@gmail.com>
Reviewed-by: Z
Tested-by: C
Refs: #123
--------------
* Should FAIL
--------------
build // Invalid end of line
chore: // Invalid, subject is missing.
ci(... is awesome // Invalid, closing of parenthesis.
docs(v1) is boring // Invalid, missing colon.
feat:of the giants. // Invalid, missing space.
built: to last. // Invalid type.
fix(multiple things): once and for all. // Invalid scope, multi-words.
¯\\_(ツ)_/¯[xys]:subject // Invalid scope parenthesis.
Prefix build(api): no // Invalid beggining.
';
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