Обратите внимание на особые случаи, когда они могут обмануть ваш сервер, вставляя поддельные совпадения.
Например:
http://www.myserver.com/virus.exe?fakeParam=.jpg
Или
http://www.myserver.com/virus.exe#fakeParam=.jpg
Я быстро изменил регулярное выражение, чтобы избежать таких случаев, но я уверен, что их может быть больше (например, вставка% 00 в путь к файлу, и он не может быть легко проанализирован регулярным выражением)
$matches = array();
preg_match_all('!http://[^?#]+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
Так, в целях безопасности всегда используйте regex самым строгим образом, например, если вы знаете сервер, запишите его в регулярное выражение или если вы знаете, что путь всегда будет включать буквы, дефисы, точки, косые черты и числа, используйте одно выражение, как:
$matches = array();
preg_match_all('!http://[a-z0-9\-\.\/]+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
Это должно избежать любого забавного сюрприза в будущем.