我对正则表达式很新,需要一些复杂的帮助
我有一个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
谢谢你的帮助!
答案 0 :(得分:3)
实际上,这是一个完整的RegEx版本:
^[^?]*\.(jpg|jpeg|gif|png)
工作原理:
^[^?]* # 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将失败
此RegEx将按照 @DevilaN 所述和explode('?', $str)
执行您所需的操作:
\.(jpg|jpeg|gif|png)(\?.*)?$
答案 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);
}