Realmente no hay mucho que explicar de la expresion que use,
 
^(http(s)?:\/\/)?  -> checa la existencia de http o https, que volviendo a pensar no tiene lógica checar su existencia o no, si cambias a httm://  seguirá marcándote que es valida la url porque lo pasa a formar parte de la siguiente cadena.  así que debería ser solo 
^(http(s)?:\/\/)  a si validamos que siempre exista uno u otro. 
.+  -> el punto(.)  dice "cualquier carácter" el más (+) "una o mas ocasiones"
\.  -> un punto literal 
[a-z]{2,6} -> revisa la extensión  2 a 6 caracteres letras 
(\.[a-z]{2,6})? -> en caso de existir una segunda extension para los que usan .com.es o similar 
.+  -> repito lo anterior cualquier carácter 1 o mas veces 
\.[a-z]{2,3} -> esto considerando que sea un archivo lo que quieres revisar, en cuyo caso debería tener una extensión de 2 a 3 caracteres. 
La expresión es bastante burda, quizás puedas requerir algo mas preciso, pero de momento esto funciona. 
por otro lado te recomiendo este sitio para construir y testear tus expresiones. 
https://regex101.com/ 
si pones tu expresión 
^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \?=.-]*)*\/?$  veras que te marca error y te dice un comentario del porque, aparte puedes activar un depurador para que veas como esta trabajando paso a paso y en donde comienzan los problemas.