It’s hard to understand what exactly you want to achieve from the question, but if you meant that the output of grep should be only the URL of the images, it should look like this:
grep -ioP "<img[^>]+src=(\\\\?['\"])?\K.*?(?=([?].*)?(?(1)\1|[ >]))"
The grep : i keys are case insensitive, o leave only the match itself, not the string containing it, P use the perl dialect of regular expressions. The expression itself reads like this:
<img # <img [^>]+ # любые символы кроме закрывающего тег (1 и более шт.) src= # src= (\\\\?['\"]) # группа1: возможно обратная косая (приходится учетверять, т.к. выражение в двойных кавычках) # и одинарная или двойная кавычка ? # группа1 может отсутствовать \K # с этой точки начинается выдаваемая часть выражения .*? # любые символы (не жадный захват) (?= # после которых идет ... (не захватывающая проверка) ([?].*)? # возможно вопросительный знак и часть которую надо отбросить (?(1) # Условие: если группа1 присутствовала \1 # то такие же символы как были в группе1, т.е. такая же кавычка как была |[ >]) # иначе (кавычек на было) пробел или конец тега )