Sto utilizzando una funzione PHP per trasformare automaticamente gli URL in una stringa di testo in un collegamento reale su cui le persone possono fare clic. Sembra funzionare nella maggior parte dei casi, tuttavia ho trovato alcuni casi in cui non è così.Espressione regolare collegamento automatico
Non capisco davvero le espressioni regolari, quindi speravo che qualcuno potesse darmi una mano con questo.
Qui è il modello Attualmente sto usando:
$pattern = "/(((http[s]?:\/\/)|(www\.))(([a-z][-a-z0-9]+\.)?[a-z][-a-z0-9]+\.[a-z]+(\.[a-z]{2,2})?)\/?[a-z0-9.,_\/~#&=;%+?-]+[a-z0-9\/#=?]{1,1})/is";
tuttavia ecco alcuni link che ho trovato che questo modello non corrisponde:
- www.oakvilletransit.ca - Non è sicuro , ma supponendo che non corrisponda a causa del codice paese di due lettere
- www.grt.ca - Un altro con il dominio .ca che non funziona
- Diversi altri .ca a ddresses
- freepublictransports.com - Indirizzi senza www. o http: // davanti a loro. Vorrei che anche questi funzionassero.
- www.222tips.com - Supponendo che non corrisponda a causa dei numeri all'inizio dell'indirizzo.
Qualcuno sa come posso modificare il modello di regex in modo che corrisponda anche a questi casi?
EDIT - Si deve anche corrispondere gli URL che possono avere un punto alla fine. Se un URL è l'ultima parte di una frase, potrebbe esserci un periodo alla fine che non dovrebbe essere incluso nel link effettivo. Attualmente questo modello tiene conto anche di questo.
EDIT 2 - Sto usando il modello come questo:
$pattern = "/((http|https):\/\/)?([a-z0-9-]+\.)?[a-z][a-z0-9-]+(\.[a-z]{2,6}){1,3}(\/[a-z0-9.,_\/~#&=;%+?-]*)?/is";
$string = preg_replace($pattern, " <a target='_blank' href='$1'>$1</a>", $string);
// fix URLs without protocols
$string = preg_replace("/href='www/", "href='http://www", $string);
return $string;
punta Regex: '[s]' non è necessario?. Basta usare 's?'. – Ryan
Consiglio regex: '{1,1}' non ha alcun senso. Neanche '{2,2}'. – Ryan
Ok, ho trovato questo codice su un'altra domanda SO. Quindi cambiando [s]? a s? e rimuovere {1,1} e {2,2} non dovrebbe fare la differenza? –