Errore di validazione URL PHP: http: // https: //example.com (aka https: // https: //example.com)

Ho avuto questo schema regex al suo posto:

$pattern = "@\b(https?://[^\s()<>\[\]\{\}]{1,".$max_length_allowed_for_each_url."}(?:\([\w\d]+\)|([^[:punct:]\s]|/)))@"; 

Sembrava funzionare abbastanza bene per validationre qualsiasi URL che ho lanciato, fino a quando ho capito che https: // http: //google.com (apparentemente anche StackOverflow considera un URL valido (ha reso quell'URL cliccabile, non io, anche se ha rimosso uno dei due punti, quindi forse sono sfortunato?) era un URL valido, quando certamente non lo è.

Ho fatto una piccola ricerca … e ho imparato che dovrei usare filter_var invece di una regex per la validazione dell'URL PHP comunque … e sono rimasto deluso nel rendersi conto che anche questo è suscettibile di questo stesso problema di validazione.

Potrei facilmente conquistarlo con:

 str_replace(arrays("https://http://","http://https://"), arrays("http://","https://"), $url); 

Ma … sembra proprio sbagliato.

Bene, è un URI valido. Tecnicamente. Guarda la RFC per gli URI se non mi credi.

  • Il componente path di un URI può contenere // .
  • http è un nome host valido.
  • La port può mancare anche se il : è presente (è specificato come *digit , non 1*digit ). (Questo è il motivo per cui Stack Overflow ha rimosso i due punti: pensavate di utilizzare la port predefinita, quindi è stata rimossa dall'URI).

Suggerisco di scrivere un caso speciale per questo. In un passaggio separato, verifica se l'URI inizia con https?://https?:// , e risolvilo.