Любой preg_match () для извлечения URL-адресов изображений из текста?

Мне нужен синтаксис preg_match() или что-то подобное, чтобы извлекать URL-адреса JPG или PNG или GIF из смешанного текста и помещать их в массив или, наконец, хранить первый URL-адрес.

возможно, некоторый синтаксис, который ищет строки, начинающиеся с http и заканчивающиеся jpg / png / gif ..

Я считаю, что это можно сделать с помощью preg_match()

Примечание: текст может быть таким: blablablabla " http://img.ruphp.com/php/xxx.jpg " blablablabla

Обратите внимание на особые случаи, когда они могут обмануть ваш сервер, вставляя поддельные матчи.

Например:

 http://img.ruphp.com/php/virus.exefakeParam=.jpg 

Или

 http://img.ruphp.com/php/virus.exe 

Я быстро модифицировал регулярное выражение, чтобы избежать таких случаев, но я уверен, что может быть больше (например, вставка% 00 в путь файла, например, и не может быть легко проанализирована с помощью регулярных выражений)

 $matches = array(); preg_match_all('!http://[^?#]+\.(?:jpe?g|png|gif)!Ui' , $string , $matches); 

Таким образом, для обеспечения безопасности всегда используйте регулярное выражение наиболее ограничительным способом, например, если вы знаете сервер, записываете его в регулярное выражение или знаете, что путь всегда будет содержать буквы, дефисы, точки, косые черты и цифры, используйте одно выражение:

 $matches = array(); preg_match_all('!http://[a-z0-9\-\.\/]+\.(?:jpe?g|png|gif)!Ui' , $string , $matches); 

Это должно избежать любого смешного удивления в будущем.

 $matches = array(); preg_match_all('!http://.+\.(?:jpe?g|png|gif)!Ui' , $string , $matches); 

Обновление для случая есть префикс http / https optional, например:

 http://example.com/image.jpg http://img.ruphp.com/php/image.jpg //example.com/image.jpg function extractImageUrlFromText($text) { preg_match_all('!(https?:)?//\S+\.(?:jpe?g|jpg|png|gif)!Ui', $text, $matches); return $$matches[0]; }