PHP正则表达式,用于检测url是否为图像文件

时间:2016-04-07 07:48:58

标签: php regex url

我对正则表达式很新,需要一些复杂的帮助

我有一个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

谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

完成RegEx版本

实际上,这是一个完整的RegEx版本:

^[^?]*\.(jpg|jpeg|gif|png)

Live Demo on Regex101

工作原理:

^[^?]*                  # Removes ?foo=bar&baz=foo
\.(jpg|jpeg|gif|png)    # Image Extension

第一部分选择?...之前的所有内容。 RegEx等同于从explode('?', $str)中选择第一个项目。第二部分与您的相同,删除了$(因为字符串的结尾可能是?之后的变量)

要处理以下不常见的文件扩展名,例如:

  • test.jpgfoo
  • test.pngbar
  • test.jpg.nope
  • image.jpg-test.php
  • image.jpg_test.php

添加否定前瞻到最后, (?![\w.\-_])

^[^?]*\.(jpg|jpeg|gif|png)(?![\w.\-_])

这将确保在接受的文件扩展名后没有字母,其他扩展名.-_。如果有,RegEx将失败

Live Demo on Regex101

此RegEx将按照 @DevilaN 所述和explode('?', $str)执行您所需的操作:

\.(jpg|jpeg|gif|png)(\?.*)?$

Live Demo on Regex101

答案 1 :(得分:1)

你的正则表达式还可以,但你需要摆脱?某事物=某事 爆炸(“?”,$ string);并使用仅包含带文件名的url的第一部分。然后继续使用正常的正则表达式。

<?php
$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);
}