【发布时间】:2016-07-27 23:05:19
【问题描述】:
我对正则表达式非常陌生,需要一些复杂的帮助。
我有一个 URL 列表,它们也可能位于如下所示的数组中:
$urls = array(
"http://example.com/page.php",
"http://example.com/page.php?key=value",
"http://example.com/image.jpg",
"http://example.com/image.jpg?key=value" ...
我想循环遍历数组(这很简单,foreach),如果 URL 指向一个图像文件,则每个字符串都返回 true。我有以下正则表达式:
"#\.(jpg|jpeg|gif|png)$# i"
... 但它似乎只返回 true 是字符串以给定的图像扩展名之一结尾。我需要补偿两个因素: 1. 如果字符串末尾有 URL 查询字符串(即?key=value)以及扩展名(例如jpg)是否实际上是查询字符串的一部分非图片文件,例如:
http://example.com/page.php?image=file.jpg
应该返回 false,因为 URL 指向的是 PHP 文件,而不是 jpg
感谢您的帮助!
【问题讨论】:
-
仅供参考:除非您实际检索它,否则您无法知道
page.php不返回图像 -
没关系,我可以检查内容类型作为备用,谢谢!
-
@Sjon:一个愉快的中间立场可能是一个 HEAD 请求,信任 Web 服务器分配正确的 Content-Type。 OP:除非您提出请求,否则您不会拥有 Content-Type,这就是他的意思。
-
好吧,我不喜欢这里的单一正则表达式解决方案:
'~^(?!.*\?.*(\.(?:jpg|jpeg|gif|png)\b)).*(?1)(?:$|\?)~' -
检查 tools.ietf.org/html/rfc3986#page-50 以了解如何正确解析 URL。在您的情况下,$6 必须以您声明的扩展名结尾。