Ваше выражение работает для меня в валидаторе, с которым я тестировал ( regex101.com ), однако он соответствует 3 отдельным группам захвата. Чтобы захватить все как одно совпадение, просто заключите весь оператор в набор скобок.
Примечание: для ясности, есть более простые способы сделать это, но ответить на конкретный вопрос, заданный ОП, это сделает их оператор совпадающим с предоставленной им ссылкой.
((http|ftp|https):\/\/([\w+?\.\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\-\\=\\+\\\\\/\\?\\.\\:\\;\\'\\,]*\.(?:jpg|JPG|jpeg|JPEG|gif|GIF|png|PNG|bmp|BMP|tiff|TIFF))?)
РЕДАКТИРОВАТЬ: После того, как ОП поможет сузить сферу их проблемы, более подходящее выражение регулярного выражения будет выглядеть примерно так: /^(((http(s?))|((s?)ftp)):)([\w \D~!@#$%^&*\\_/-=+/?.:;',]){1,}\.(jpg|gif|png)$/i
Давайте разберемся с этим: во-первых, это говорит о том, что он должен начинаться либо с 'http' с необязательным 's', либо, если его там нет, он будет искать 'ftp' с необязательным 's', префиксируя егоучитывать безопасные формы FTP. это должно сопровождаться двоеточием. Следующий набор принимает практически любой обычно используемый символ или символ в пути URL. Наконец, он гарантирует, что выражение заканчивается фактическим расширением изображения. перенос выражения в /{expression}/i
указывает на то, что выражение нечувствительно к регистру и будет соответствовать как верхнему, так и нижнему регистру в любой комбинации.
В качестве дальнейшего примечания вы также можете учесть форматы печати.jpeg, .tif и т. д.