.*?
слишком много соответствует, потому что следующая группа является необязательной, ==> ваш src
соответствует одному из .*?
вокруг. если вы удалите ?
после первой группы, это сработает.
Обновление: как указывал @morja, ваше решение - переместить первый .*?
в необязательную часть src.
Просто для полноты: /<script (?:.*?(src="(.*?)"))?.*?>(.*?)<\/script>/ig
Вы можете увидеть это здесь, на рубрике (исправил и мою ссылку)
Если вы не хотите использовать содержимое первой группы захвата, то сделайте ее группой без захвата, используя (?:)
/<script (?:.*?(?:src="(.*?)"))?.*?>(.*?)<\/script>/ig
Тогда ваш желаемый результат в $ 1 и $ 2.