Любой preg_match (), чтобы извлечь изображения URL из текста? - PullRequest
3 голосов
/ 27 января 2010

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

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

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

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

Ответы [ 3 ]

12 голосов
/ 27 января 2010

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

Например:

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);

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

5 голосов
/ 27 января 2010
$matches = array();
preg_match_all('!http://.+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
2 голосов
/ 07 июля 2016

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

http://example.com/image.jpg

https://example.com/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];
            }
...