Jump to content

Readdir Question: How to exclude files whose names begin with a certain word?


Go to solution Solved by requinix,

Recommended Posts

Can't seem to find a solution to this:

 

I want to use the following readdir code:

 

++++++++++++

<?php
 
if ($handle = opendir('.')) {
    while (false !== ($entry = readdir($handle))) {
        if ($entry != "." && $entry != ".." && $entry != "sort.php" && $entry != "sort2.php" && $entry != "index.php") {
            echo "<a href='$entry'>$entry</a><br />";
        }
    }
    closedir($handle);
}
?>

++++++++++++

 

The above code works perfectly to display all the files in my directory. (All the files to be displayed on my webpage are .pdf files (the code above excludes the .php files in the directory).)

 

These pdf files consist of multiple Catalog_date.pdf, Schedule_date.pdf and Newsletter_date.pdf files, each of which category I want to place in a separate column.

 

To do this, I have three CSS column class <div> sections. I will put the above code in each of the three <div class> sections and exclude two of the three categories depending on which column it is. 

 

 

 

I was using another code to do this that works perfectly in all respects. It lists the separate categories in separate columns. (see image file below):

++++++++++++

<?php
$string = 'Catalog';
 
echo "";
$PATH = $_ENV['DOCUMENT_WWW'];
$d=$PATH.'.';
 
$files=array();
$dir = opendir($d) or die("couldn't open directory");
while ($f = readdir($dir)) {
if (!eregi("\.jpg",$f) && $f!=='.' && $f!=='..'  && eregi("$string",$f) && eregi("\.pdf",$f)){ #if does not match .jpg . and ..
array_push($files,"$f");
echo "<a href='$f'>$f</a><br>";
}
if( is_dir($_dir))
closedir( $d );}
?>

 

++++++++++++

 

But "eregi" has been deprecated and I wanted to update my php code to account for this. However, I don't know how to simulate the "f (!eregi("\.jpg",$f) && $f!=='.' && $f!=='..'  && eregi("$string",$f) && eregi("\.pdf",$f))" part that allows me to fill the Catalog column with only the Catalog_date.pdf files, etc. (I have attached my currently working page that uses the older code as the example of what I want to do.)

 

Can anyone help me with either including only those files that begin with the word Calendar_, Schedule_ or Newsletter_ for each script; or excluding two of the three files that begin with those words?

 

I have looked at the info in the PHP Manual as well as other Googled places, but don't find enough information to make the code function.

 

Hope this makes sense. 

 

Any assistance greatly appreciated.

 

Shelley

 

 

 

post-97135-0-28754700-1370386661_thumb.jpg

Do you want to show all the *.pdf files? There's a much simpler way to do this:

<?php

$files = glob($d . "/*.pdf");
foreach ($files as $f) {
	echo "<a href='{$f}'></a><br />";
}

?>
glob For just one type of file use (eg) "/Catalog_*.pdf".

 

Otherwise if it's literally those four types (and you want them all together) then same as above but using

$files = glob($d . "/{Catalog,Calendar,Schedule,Newsletter}_*.pdf", GLOB_BRACE);
Edited by requinix

Good Morning. The above code worked perfectly for me with one exception:

 

When the code returns the files to the page, it includes a "/." before each title. How do I remove this prefix. Many thanks for help with this.

 

Here is my code:

<?php
$d = ".";
$handle = opendir($d);
$files = glob($d .'/Catalog_*.pdf');


if ($handle) {
foreach ($files as $f) {
echo "<a href='{$f}'>$f</a><br />";
}
closedir($handle);
}

?>

 

This returns:
./Catalog_* (whatever the title is)
Edited by shelley3

Many thanks to all of you (requinix, AbraCadaver and Christian F.) for your help with my questions. All is now working. Here is my final code:

<?php
$d = ".";

$files = glob($d .'/Catalog_*.pdf');
krsort($files);

if ($d) {
foreach ($files as $f) {
$f = basename($f);
	echo "<a href='{$f}'>$f</a><br />";
}
closedir($d);
}
?>

Code is repeated in three CSS columns, each with a different Title_* so readers can choose the archives they need. So neat!

Done! Thanks. Obviously have to read up on glob(). So here is the final final:

<?php
$d = ".";

$files = glob($d .'/Publication_*.pdf');
krsort($files);

if ($d) {
foreach ($files as $f) {
$f = basename($f);
	echo "<a href='{$f}'>$f</a><br />";
}

}
?>
  • Solution

krsort() sorts based on the keys of the array. $files will just have useless numeric keys. You want rsort.

 

Also your if ($d) won't help anything. All you're doing is checking whether $d has a value. It definitely does. If anything you'd check whether $files has anything, but you can let the foreach do that for you (since you don't do anything else).

 

Unraveling a little bit more, if you're doing a basename() and providing a link to the file, the script will only work for $d=the current directory. If you provide anything else then you'll have to remove the basename for the link to work. Meanwhile glob() doesn't need to know about the ./ path since it'll default to that anyways. Removing that means you don't need basename() at all.

 

And now you're left with

<?php

// $d = ""; if you really want something
// if not the current directory then include the trailing slash, like
// $d = "subdirectory/";
// so that the filename pattern you give to glob() remains only the filename

$files = glob('Publication_*.pdf'); // $d . 'Publication_*.pdf'
rsort($files);

foreach ($files as $f) {
	echo "<a href='{$f}'>{$f}</a><br />";
}

?>
This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.