4

我需要一种preg_match()语法或类似的东西来从混合文本中提取JPGPNGGIF URL,并将它们放在一个数组中或最后存储第一个 url。

可能是一些搜索以 http 开头并以 jpg/png/gif 结尾的字符串的语法。

我相信可以做到preg_match()

注意:文字可以是这样的:blablablabla” http://www.example.com/xxx.jpg “blablablabla

4

3 回答 3

13

请注意他们可以欺骗您的服务器插入假匹配的特殊场合。

例如:

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

因此,为了安全起见,始终以最严格的方式使用正则表达式,例如,如果您知道服务器,将其写入正则表达式,或者如果您知道路径总是包含字母、连字符、点、斜杠和数字,请使用一种表达方式:

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

这应该避免将来出现任何有趣的惊喜。

于 2010-01-26T23:51:18.663 回答
5
$matches = array();
preg_match_all('!http://.+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
于 2010-01-26T22:48:02.620 回答
3

更新案例有前缀 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];
}
于 2016-07-07T02:29:40.827 回答