我正在尝试根据它包含的文件的后缀来评估字符串。
我需要区分仅包含图像文件的字符串(.png
,.gif
,.jpg
,.jpeg
或.bmp
)和包含的字符串图像和非图像文件的混合。
我做错了什么?
if (preg_match('~\.(png\)|gif\)|jpe?g\)|bmp\))~', $data->files)) {
echo 'image only;'
} else {
echo 'image + other types';
}
包含混合物的示例字符串:
filename 1 (https://example.com/test.pdf),
filename 2 (https://example.com/cool_image.jpg),
filename 3 (https://example.com/other-file.docx)
仅包含图像的示例字符串:
filename 1 (https://example.com/another.png),
filename 2 (https://example.com/cool_image.jpg)
答案 0 :(得分:4)
正则表达式错误。每次延期后您都有getLink()
。这将有效:
)
完整示例:
~\.(png|gif|jpe?g|bmp)~i
使用更正后的正则表达式,现在您可以检查该批文件是仅包含图像,图像和文件,还是仅包含文件。我们已经完成了第一部分(检查是否有图像)。有了这个正则表达式,我们可以检查是否有非图像:
<?php
if (preg_match('~\.(png|gif|jpe?g|bmp)~i', "https://example.com/test.png")) {
echo 'image only';
}
else {
echo 'image + other types';
}
它使用负向前瞻来断言扩展在行中不匹配。最后,有一个非捕获组来检查行尾或逗号(以符合您的格式)。
最后,检查两个正则表达式,看看每个批次真正包含的内容:
/^(?!.*[.](png|gif|jpe?g|bmp))(?:.*$|,)/im
注意:使用@ mickmackusa的测试列表
答案 1 :(得分:2)
您正在逃避括号,因此他们会逐字接受治疗。
您正在寻找的正则表达式只是:$
.jpg.exe
请注意,最后的(\.png|gif|jpe?g|bmp)$
表示字符串的结尾是至关重要的;没有它,字符串的任何部分都是有效的匹配。因此,https://example.com/test.pdf
https://example.com/other-file.docx
https://example.com/cool_image.jpg.exe
https://example.com/cool_image.jpg
等文件将被视为&#39;图像&#39;。
对字符串运行正则表达式i
:
~(\.png|gif|jpe?g|bmp)$~i
显示只有最终链接匹配。
可以看到 here 。
请注意,您也可能希望在正则表达式的末尾抛出:
修饰符以允许大写的文件扩展名。这可以使用re.split()
完成。