我需要一种preg_match()
语法或类似的东西来从混合文本中提取JPG或PNG或GIF URL,并将它们放在一个数组中或最后存储第一个 url。
可能是一些搜索以 http 开头并以 jpg/png/gif 结尾的字符串的语法。
我相信可以做到preg_match()
注意:文字可以是这样的:blablablabla” http://www.example.com/xxx.jpg “blablablabla
我需要一种preg_match()
语法或类似的东西来从混合文本中提取JPG或PNG或GIF URL,并将它们放在一个数组中或最后存储第一个 url。
可能是一些搜索以 http 开头并以 jpg/png/gif 结尾的字符串的语法。
我相信可以做到preg_match()
注意:文字可以是这样的:blablablabla” http://www.example.com/xxx.jpg “blablablabla
请注意他们可以欺骗您的服务器插入假匹配的特殊场合。
例如:
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);
这应该避免将来出现任何有趣的惊喜。
$matches = array();
preg_match_all('!http://.+\.(?:jpe?g|png|gif)!Ui' , $string , $matches);
更新案例有前缀 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];
}