Регулярные вырежения. Выбрать файлы, которые начинаются на символ: точка (скрытые)

iguania
На сайте с 10.12.2010
Offline
72
671

Добрый вечер!

Подскажите, пожалуйста, как можно с помощью регулярных выражений выбрать скрытые файлы unix-системы (т.е. те, что начинаются на точку)? Например,

.git

.backup

.list.txt

Ниже привожу свой код. В массив должны попадать все файлы (папки), которые не являются скрытыми, т.е. не начинаются на точку. Дело в том, что это регулярное выражение почему-то не работает...


if(!preg_match('/\.^.+/' ,$var))
$list[$counter++] = $var;

Всем ответившим спасибо.

Все всегда заканчивается хорошо. Если все закончилось плохо, значит, это еще не конец…
Joker-jar
На сайте с 26.08.2010
Offline
167
#1

А если так?

if ( $var[0] != '.' ) ...
iguania
На сайте с 10.12.2010
Offline
72
#2

Joker-jar, таким образом также не получиться избавиться от скрытых файлов, а только лишь от каталогов перехода на уровень выше... От них получилось избавиться без проблем


if(!preg_match('/(\.|\.\.|~)$/', $element))
{
...
}
Joker-jar
На сайте с 26.08.2010
Offline
167
#3

Почему же? Проверяем, чтобы первый символ не был точкой. Избавляемся от скрытых файлов, от ".", от "..". Разве что, можно еще добавить проверку на пустую строку.

iguania
На сайте с 10.12.2010
Offline
72
#4
Joker-jar:
Проверяем, чтобы первый символ не был точкой.

Joker-jar, не совсем понял каким именно образом это проверить нужно. Подскажите, пожалуйста, еще раз. Если Вы имеете ввиду, что так:


if ( $var != '.' ) ...

то этот вариант у меня не срабатывает. Да и проверяет то он, насколько я понимаю, не первый символ, а все имя вцелом.

gormarket
На сайте с 29.12.2010
Offline
47
#5

if(!preg_match('/^\./' ,$var)){

$list[$counter++] = $var;

}

сработает для строк в $var, которые не начинаются с точки

т.е проигнорирует строки '.', '..', '.git' и т.д.

Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)
Joker-jar
На сайте с 26.08.2010
Offline
167
#6

не

if ( $var != '.' ) ...

а

if ( $var[0] != '.' ) ...

нелепый баг этот с квадратными скобками в листинге кода, когда же его починят. Код gormarket'а тоже, с виду, рабочий. Но в данной задачи не вижу причин не воспользоваться просто проверкой первого символа.

iguania
На сайте с 10.12.2010
Offline
72
#7

Есть, все работает. Большое спасибо Вам Joker-jar и Вам gormarket. Это вариант оказался самым оптимальным в моем случае

if(!preg_match('/^\./' ,$var)) {

...
}

В итоге получился скрипт, который получает в массив пути всех файлов, содержащихся в указанном каталоге.


#! /usr/bin/php
<?php
$gPath = '/home/iguania/projects/t-site.ru';

recursiveGlob($gPath, &$list);
foreach($list as $value)
echo $value . "\n";

function recursiveGlob($path, &$list)
{
static $counter = 0;

$dir = opendir($path);
while(($element = readdir($dir)) !== false)
{
if(!preg_match('/^\./', $element))
{
$var = $path . '/' . $element;

if(is_dir($var))
recursiveGlob($var, &$list);
elseif(is_file($var))
$list[$counter++] = $var;
}
}
closedir($dir);
}
?>

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий