$re = '/([-\.\w]+:\/{2,3})(?!.*[.]{2})(?![-.*\.])((?!.*@\.)[-_\w@^=%&:;~+\.]+(?<![-\.]))(\/[-_\w@^=%&:;/~+\.]+(?<!\.))?\??([-_\w=&@$!|~+]+)*#?([-_\w=&@$!|~+]+)*/ium';
$str = 'DB_URL=postgresql://postgres:postgres@localhost/postgres?timeout=0
# Damn, Daniel!
Bob: have you checked https://www.facebook.com?
lorem https://github.com/justsml?tab=activity#top ipsum
smb:///winbox/dfs/ - ipp://printer
leading text chrome-extension://flags??#
s3://buckets/for/all?true=true
s3:///////buckets-o-fun
pkcs11://because-pkcs7-is-weak#only=hash
\\||@@https://www.google.com <- should match when extracting
https://we - this is valid
s3://buckets-o-fun/!hi/raw=val&#keep=hashin\'?
http://aaa.com.co.com:8080/test?dan=dev#den
hi. pkcs11://because-pkcs7-is-weak
hi. a://b/c?d=e#f=g && a://b/c?d]
hi. chrome-extension://flags hi.
hi. ms-help://good-luck/index.html hi.
hi. .iris.beep://really/dots. hi.
hi. iris.beep://really/dots?test=qs hi.
---
a://b]/c - Should match `a://b` - it\'s smallest match.
http://www.c:ool.com.au - this one\'s tricky, should match auth URIs: proto://user:pass@host. Including cases where the password could be omitted (`proto://user@host`.)
boop://really-/ -- technically domains shouldn\'t end in dashes or other \'special\' chars, but this is technically a valid URI.
---
a://b./c?d. -- bad dns, trailing dot: tricky w/o look-arounds. (Adding an OR pattern would muddle the returned data indexes.) -- should match `a://b`
Invalid Examples:
https://www...google...com
https://we@.com
https://asdas-.com
http://-apple-.com
a://(b/c
chrome-extension)://flags
ms-help://|good-luck.html
. , ; : ) ] }
';
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