Ecco una grande espressione regolare lungo per corrispondenza di un URL:
(?i)\b((?:(?:[a-z][\w-]+:)?(?:/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))
La versione estesa di quella (per contribuire a rendere più comprensibile):
(?xi)
\b
( # Capture 1: entire matched URL
(?:
(?:[a-z][\w-]+:)? # URL protocol and colon
(?:
/{1,3} # 1-3 slashes
| # or
[a-z0-9%] # Single letter or digit or '%'
# (Trying not to match e.g. "URI::Escape")
)
| # or
www\d{0,3}[.] # "www.", "www1.", "www2." … "www999."
| # or
[a-z0-9.\-]+[.][a-z]{2,4}/ # looks like domain name followed by a slash
)
(?: # One or more:
[^\s()<>]+ # Run of non-space, non-()<>
| # or
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
)+
(?: # End with:
\(([^\s()<>]+|(\([^\s()<>]+\)))*\) # balanced parens, up to 2 levels
| # or
[^\s`!()\[\]{};:'".,<>?«»“”‘’] # not a space or one of these punct chars
)
)
Questi entrambi provengono da this page, ma leggermente modificato per rendere il protocollo opportunamente facoltativo - dovresti leggere quella pagina per aiutarti a capire cosa sta facendo, e ha anche una variante che corrisponde solo agli URL basati sul web, che potresti voler dare un'occhiata anche tu.
fonte
2010-08-06 20:03:31
Grazie per tutte le vostre risposte. Ha funzionato alla grande – NLV
Tutti i tuoi Regex accetteranno @@ ## $$ come URL valido. Qualche idea? – NLV
NLV, non hai specificato che volevi che correggessimo la tua espressione regolare, hai appena chiesto come cambiarlo per accettare qualsiasi protocollo. In ogni caso, vedere la mia nuova risposta di seguito che fornisce una regex completa (e complessa) di convalida dell'URL. –