You want to find URLs in a larger body of text. URLs may or may not be enclosed in punctuation that is part of the larger body of text rather than part of the URL. You want to give users the option to place URLs between quotation marks, so they can explicitly indicate whether punctuation, or even spaces, should be part of the URL.
\b(?:(?:https?|ftp|file)://|(www|ftp)\.)[-A-Z0-9+&@#/%?=~_|$!:,.;]* [-A-Z0-9+&@#/%=~_|$] |"(?:(?:https?|ftp|file)://|(www|ftp)\.)[^"\r\n]+" |'(?:(?:https?|ftp|file)://|(www|ftp)\.)[^'\r\n]+'
|Regex options: Free-spacing, case insensitive, dot matches line breaks, anchors match at line breaks|
The previous recipe explains the issue of mixing URLs with English text, and how to differentiate between English punctuation and URL characters. Though the solution to the previous recipe is a very useful one that gets it right most of the time, no regex will get it right all of the time.
If your regex will be used on text to be written in the future,
you can provide a way for your users to quote their URLs. The solution
we present allows a pair of single quotes or a pair of double quotes
to be placed around the URL. When a URL is quoted, it must start with
one of several schemes: ‹
https?|ftp|file› or one of two subdomains
www|ftp›. After the scheme or subdomain, the regex allows the URL to include any character, except for line breaks, and the ...