0

So I have an array with values, this case file extentions but i'm using preg_match to filter out file extentions that are not allowed.

Is there an easy way to translate an array to an regex pattern?

Source array

(
 [1] => 'file-to-path/thumbs/allowedfile.pdf',
 [2] => 'file-to-path/thumbs/notallowedfile.psd',
 [3] => 'file-to-path/project/test/notallowedfile.txt',
)

Allowed extentions array

( 
 [0] => bmp
 [1] => jpg
 [2] => jpeg
 [3] => gif
 ...
)

The code that im using right now.

foreach($array as $key => $val){
 if( !preg_match('/^.*\.(jpg|png|jpeg|bmp|gif|pdf)$/i', $val ) ){
 // this part needs to be an array
 '/^.*\.(jpg|png|jpeg|bmp|gif|pdf)$/i' -> [array with the values]
 }
}
asked Jan 22, 2018 at 13:25
2

3 Answers 3

2

I would avoid regex for this, and use pathinfo($value, PATHINFO_EXTENSION) and in_array()

For example, which populates an $error array and filters your array.

<?php
$allowed_ext = array ( 
 'bmp',
 'jpg',
 'jpeg',
 'gif',
 'pdf'
);
$files = array(
 1 => 'file-to-path/thumbs/allowedfile.pdf',
 2 => 'file-to-path/thumbs/notallowedfile.psd',
 3 => 'file-to-path/project/test/notallowedfile.txt'
);
$errors = [];
foreach ($files as $key => $value) {
 if (!in_array(pathinfo($value, PATHINFO_EXTENSION), $allowed_ext)) {
 $errors[] = basename($value).' is not allowed.';
 unset($arr[$key]);
 }
}
print_r($errors);
print_r($files);

https://3v4l.org/oSOJT

Result:

Array
(
 [0] => notallowedfile.psd is not allowed.
 [1] => notallowedfile.txt is not allowed.
)
Array
(
 [1] => file-to-path/thumbs/allowedfile.pdf
)

If you just want to filter the array, then you can use array_filter()

$files = array_filter($files, function ($file) use ($allowed_ext) {
 return in_array(pathinfo($file, PATHINFO_EXTENSION), $allowed_ext);
});
answered Jan 22, 2018 at 13:34
Sign up to request clarification or add additional context in comments.

Comments

0

You can use array_filter function then check the extension of a single file in the list of available extensions, and return true if it's valid extension otherwise returns false and it's exclude.

$validFiles = array_filter($files, function ($file) use ($key, $value, arrOfValidExtensions) {
 $fileExtenstion = getFileExtension($value); //Implement this function to return the file extension
 return in_array($fileExtension, $arrOfValidExtensions);
});
answered Jan 22, 2018 at 13:31

Comments

0

all not allowed files you can quick ignore them with minimum cpu use

function check(){
 $who = array(
 1 => 'file-to-path/thumbs/allowedfile.pdf',
 2 => 'file-to-path/thumbs/notallowedfile.psd',
 3 => 'file-to-path/project/test/notallowedfile.txt'
 );
 return preg_grep('/^.*\.(jpg|png|jpeg|bmp|gif|pdf)$/i', $who );
}
print_r(check());

In my browser, I got this push Run Code Snippet:

Array
(
 [1] => file-to-path/thumbs/allowedfile.pdf
)

or

function check($who){
 return preg_grep('/^.*\.(jpg|png|jpeg|bmp|gif|pdf)$/i', $who );
}
print_r(check(array(
 1 => 'file-to-path/thumbs/allowedfile.pdf',
 2 => 'file-to-path/thumbs/notallowedfile.psd',
 3 => 'file-to-path/project/test/notallowedfile.txt'
)));
mickmackusa
49.3k13 gold badges98 silver badges165 bronze badges
answered Jan 22, 2018 at 13:49

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.