[英]PHP regular expression to detect if url is to an image file
我对正则表达式很陌生,需要一些复杂的帮助。
我有一个 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
感谢您的帮助!
实际上,这是一个完整的 RegEx 版本:
^[^?]*\.(jpg|jpeg|gif|png)
它是如何工作的:
^[^?]* # Removes ?foo=bar&baz=foo
\.(jpg|jpeg|gif|png) # Image Extension
第一部分选择所有内容,直到?...
。 它是相当于从explode('?', $str)
选择第一项的 RegEx。 第二部分与您的相同,删除了$
(因为字符串的末尾可能是?
之后的变量)
处理以下异常文件扩展名的情况,例如:
test.jpgfoo
test.pngbar
test.jpg.nope
image.jpg-test.php
image.jpg_test.php
在末尾添加一个负前瞻, (?![\\w.\\-_])
:
^[^?]*\.(jpg|jpeg|gif|png)(?![\w.\-_])
这将确保没有字母、另一个扩展名、 .
, -
或_
在接受的文件扩展名之后。 如果有,RegEx 将失败
如果你按照@DevilaN所说的做并expand explode('?', $str)
这个正则表达式会做你需要的:
\.(jpg|jpeg|gif|png)(\?.*)?$
你的正则表达式没问题,但你需要去掉 ?something=something Just purge("?", $string); 并使用仅包含文件名的 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"
);
function isImage($l) {
$arr = explode("?", $l);
return preg_match("#\.(jpg|jpeg|gif|png)$# i", $arr[0]);
}
foreach ($urls as $url) {
echo $url . ": " .(isImage($url) ? "true" : "false") . "\n";
}
结果是:
http://example.com/page.php: false
http://example.com/page.php?key=value: false
http://example.com/image.jpg: true
http://example.com/image.jpg?key=value: true
如果你想要纯正则表达式解决方案,那么:
function isImage($l) {
return preg_match("/^[^\?]+\.(jpg|jpeg|gif|png)(?:\?|$)/", $l);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.