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.