Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Проблема с регулярками


Автор: DioNiR 9.3.2007, 03:28
У меня есть разные файлы с разными расширениями.

Проьлема такова так как я с регулярками почемуто не дружу и не знаю реально ли так сделть.
Нужно узнать расширение файла. Проверить существует ли файл расширение.php и вставить его. Если нет то вставляет какой нить по стандарту. 

как такое организовать?

Автор: mishaSL 9.3.2007, 13:00
DioNiR, опишите проблему четче, а то непонятно что и где Вы собираетесь проверять. Если Вам необходимо проверить существование файла, то можете воспользоваться http://ru.php.net/file_exists

Если Вы хотите из переменной содержащей имя файла получить его расширение, то можно так:
Код

<?php
$name = 'file.php';
preg_match('/.*?\.([a-z]{2,4})$/is', $name, $match);
print 'Файл '.$name.' имеет расширение '.$match[1];
?>

Автор: SelenIT 9.3.2007, 17:59
mishaSL, имхо, брать расширение файла регулярками - все же перебор. Тем более пример выше не "возьмет", к примеру, .mp3 или .class. По-моему, для большинства практических целей вполне достаточно strrchr('.', $name). А если нужны все расширения (.tar.gz) - то что-нибудь вроде такого...
Код

list($name, $extension) = explode('.', $full_name, 2);

Автор: mishaSL 9.3.2007, 19:41
Цитата(SelenIT @  9.3.2007,  17:59 Найти цитируемый пост)
пример выше не "возьмет", к примеру, .mp3 или .class. 


.class - возьмет, а про цифры я и забыл, тогда лучше так:
Код

$name = 'class.file.php5';
preg_match('/.*?\.([^.]{2,4})$/is', $name, $match);
print 'Файл '.$name.' имеет расширение '.$match[1];





Цитата(SelenIT @  9.3.2007,  17:59 Найти цитируемый пост)
list($name, $extension) = explode('.', $full_name, 2);


На практике часто используются имена такого вида: class.file.php
У твоего подхода будут проблемки с такими именами...

Автор: SelenIT 9.3.2007, 19:58
mishaSL, так я это и имел в виду - все зависит от того, что считаем расширением. Если только последнее - то достаточно strrchr, если все "от первой точки", как в примере с .tar.gz - то эксплод на 2 части по первой точке. Ну а если нужна полная гибкость и .tar.gz необходимо считать расширением, а class.file в Вашем последнем примере - частью имени, тогда, наверное, действительно только регулярка вроде
Код

preg_match('/\.(((tar|exe|doc|txt)\.)?[^.]+)$/is', $name, $match);
с полным перечислением всех допустимых по условию задачи вариантов первого расширения - другого выхода я не вижу...

p.s. А .class Ваш вариант все-таки не возьмет - там 5 букв...

Автор: mishaSL 9.3.2007, 20:26
Цитата(SelenIT @  9.3.2007,  19:58 Найти цитируемый пост)
p.s. А .class Ваш вариант все-таки не возьмет - там 5 букв... 


Да это у меня голова после праздника плохо работает...

Автор: DioNiR 9.3.2007, 20:51
Воспользовался
Код
preg_match('/\.(((tar|exe|doc|txt)\.)?[^.]+)$/is', $name, $match);

Работает так как и нужно.

Автор: SelenIT 9.3.2007, 23:57
DioNiR, обязательно надо было из множества легких вариантов выбрать самый сложный и наверняка в данной конкретной задаче избыточный... smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)