Search code examples
phpregexpreg-matchpreg-match-allimage-file

How to check string contains only image urls


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)

Solution

  • 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
    ----------------------------------------------------