繁体   English   中英

PHP正则表达式来检测url是否是图像文件

[英]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)

Regex101 上的现场演示

它是如何工作的:

^[^?]*                  # 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 将失败

Regex101 上的现场演示


如果你按照@DevilaN所说的做并expand explode('?', $str)这个正则表达式会做你需要的:

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

Regex101 上的现场演示

你的正则表达式没问题,但你需要去掉 ?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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM