Casesensitve bei glob()

Fragenfrager

Erfahrenes Mitglied
Hallo liebes Forum,

mit einem Skript lasse ich einen bestimmten Windowsordner nach Dateien durchsuchen, die einen bestimmten Teilstring haben.
Das ganze sieht verkürzt so aus:
PHP:
// $suchbegriff stammt aus einem Formular
$pfad="//server/ordner/*$suchbegriff*";
    foreach(glob($pfad) as $datei) 
    {     
       $datei=str_replace('/','\\',$datei);
      echo "\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<a href=\"$datei\" target='_blank'>$datei</a>\n\t\t\t</td>\n\t\t</tr>"; 
    }
Das ganze funktioniert, solange im Dateinamen nur klein geschrieben wird.
"meinedatei.txt" würde bei der Suche gefunden werden, "meineDatei.txt" leider nicht.
Mir fehlt gerade der Ansatz, wie ich trotzdem "meineDatei.txt" als Ergebnis bekomme.
strtolower($pfad) bringt natürlich nichts, ich müsste entweder $pfad oder glob($pfad) "allgemeiner" machen, so dass auf Groß-und Kleinschreibung nicht geachtet wird...
 
Moin Forum,
ich konnte das Problem nun lösen. ich finde es zwar nicht sehr elegant, aber folgender Code funktioniert:
Ich wandele alle Dateipfade in lowercase und überprüfe dann mit strpos auf das Vorkommen des Suchbegriffs (der natürlich vorher im Skript schon auf lowercase umgewandelt wurde.
PHP:
$pfad="//server/ordner/*$suchbegriff*";
 foreach (glob(dirname($pfad) . '/*')  as $datei)
{    
        if(strpos(strtolower($datei),$suchbegriff)!==false){
                $datei=str_replace('/','\\',$datei);
                echo "\n\t\t<tr>\n\t\t\t<td>\n\t\t\t\t<a href=\"$datei\" target='_blank'>$datei</a>\n\t\t\t</td>\n\t\t</tr>";
  }
}
 
Die Variante hat den Vorteil, dass niemand was in den glob-String schmuggeln kann. Etwa "/../"-Pfadanteile.

Eventuell wäre es sinnvoll, nur im basename zu suchen. Aktuell liefert dir eine Suche nach „server“ etwa jeden Eintrag, weil „server“ im Pfad steht.

Mit stripos kann case-insensitive gesucht werden. Das spart das händische Umwandeln.

Für Systeme mit Multibyte-Dateinamen (UTF-8 und dergleichen) ist wahrscheinlich mb_stripos vorzuziehen.

Als Anregung:

PHP:
<?php

$needle = 'FOO';

$pfad = __DIR__;

$files = glob($pfad . '/*');

$filesWithNeedle = array_values(
    array_filter(
        $files,
        function ($file) use ($needle) {
            return mb_stripos(basename($file), $needle, 0, 'UTF-8') !== false;
        }
    )
);

foreach ($filesWithNeedle as $file) {
    echo $file, "\n";
}
 
Zurück