I'm trying to assess a string based on the suffix of the files that it contains.
I need to differentiate between strings that contain only image files (.png
,.gif
, .jpg
,.jpeg
, or .bmp
) and strings which contain a mixture of image and non-image files.
What am I doing wrong?
if (preg_match('~\.(png\)|gif\)|jpe?g\)|bmp\))~', $data->files)) {
echo 'image only;'
} else {
echo 'image + other types';
}
Example string containing a mixture:
filename 1 (https://example.com/test.pdf),
filename 2 (https://example.com/cool_image.jpg),
filename 3 (https://example.com/other-file.docx)
Example string containing only images:
filename 1 (https://example.com/another.png),
filename 2 (https://example.com/cool_image.jpg)
After reading and re-reading your question more than 20 times, I think I know what you are trying to do.
For every string (batch of files), I run two preg_match()
checks. One that seeks files with a suffix of png
,gif
,jpg
,jpeg
, or bmp
. Another that seeks files that DO NOT have a suffix in the aforementioned list.
*note: (*SKIP)(*FAIL)
is a technique used to match and immediately disqualify characters in a pattern.
Code: (PHP Demo) (Image Pattern Demo) (Non-Image Pattern Demo)
$tests=[
'Non-Images Only'=>'filename 1 (https://example.com/test.exe)',
'Mixed-Type'=>'filename 1 (https://example.com/test.pdf),
filename 2 (https://example.com/cool_image.jpg),
filename 3 (https://example.com/other-file.docx),
filename 4 (https://example.com/nice_image.png)',
'No Files'=>'filename 1 (),
filename 2 ()',
'Images-Only'=>'filename 1 (https://example.com/another.png),
filename 2 (https://example.com/cool_image.jpg))'];
$image_pattern='~\.(?:png|gif|jpe?g|bmp)\),?$~im';
$non_image_pattern='~\.(?:(?:png|gif|jpe?g|bmp)(*SKIP)(*FAIL)|[^.)]+)\),?$~im';
foreach($tests as $type=>$string){
echo "\t\tAssessing:\n---\n";
echo "$string\n---\n";
echo "Expecting: $type\n";
echo "Assessed as: ";
$has_image=preg_match($image_pattern,$string);
$has_non_image=preg_match($non_image_pattern,$string);
if($has_image){
if($has_non_image){
echo "Mix of image and non-image files";
}else{
echo "Purely image files";
}
}else{
if($has_non_image){
echo "Purely non-image files";
}else{
echo "No files recognized";
}
}
echo "\n----------------------------------------------------\n";
}
Output:
Assessing:
---
filename 1 (https://example.com/test.exe)
---
Expecting: Non-Images Only
Assessed as: Purely non-image files
----------------------------------------------------
Assessing:
---
filename 1 (https://example.com/test.pdf),
filename 2 (https://example.com/cool_image.jpg),
filename 3 (https://example.com/other-file.docx),
filename 4 (https://example.com/nice_image.png)
---
Expecting: Mixed-Type
Assessed as: Mix of image and non-image files
----------------------------------------------------
Assessing:
---
filename 1 (),
filename 2 ()
---
Expecting: No Files
Assessed as: No files recognized
----------------------------------------------------
Assessing:
---
filename 1 (https://example.com/another.png),
filename 2 (https://example.com/cool_image.jpg))
---
Expecting: Images-Only
Assessed as: Purely image files
----------------------------------------------------