Здесь скоро опять что то будет...
Your fucking browser doesn't support JavaScript, so you can't post here.
Loading
Объявления
11.12.2009, 01:57
#1
Эксперт
Регистрация: 19.05.2008
Сообщений: 1,461
Версия vB: 3.8.4
Пол:
Поблагодарил(-а): 621
Поблагодарили 1,124 раз(а) в 520 сообщениях
Репутация: Эксперт (1187 )
Помогите разобраться с preg_match()
Вот уже 2 день безуспешно борюсь с preg_match()
Задача тривиальная, но то ли я туплю, то ли не понимаю как сделать.
У меня есть путь к каталогу, он может быть как в виндовс так и юникс виде
То есть
Вариант 1 - "C:\websites\homepages\www\includes\phpmorphy\dicts"
Вариант 2 - "/websites/homepages/www/includes/phpmorphy/dicts"
При этом в конце строки может быть, а может не быть "\" или "/" соответственно.
Хочу проверить наличие по этому пути файла.
Для этого я делаю проверку:
PHP код:
$phpmorphy_dict_path = 'C:\websites\homepages\www\includes\phpmorphy\dicts' ;
if ( preg_match ( '/\//i' , $phpmorphy_dict_path ))
{
if ( preg_match ( '/\/$/i' , $phpmorphy_dict_path ))
{
$slash = '' ;
}
else
{
$slash = '/' ;
}
}
else if ( preg_match ( "/\\/i" , $phpmorphy_dict_path ))
{
if ( preg_match ( "/\\$/i" , $phpmorphy_dict_path ))
{
$slash = '' ;
}
else
{
$slash = ;
}
}
Но ничего не выходит постоянно ошибки.
Я пробовал и "\\\" использовать.
В результате мне нужно провести проверку:
PHP код:
if( file_exists ( $phpmorphy_dict_path . $slash . "common_aut.ru_ru.bin" )) { код }
В чем трабла?
Рекламка
Реклама на форуме
Файловый Архив
Неограниченное количество категорий и суб-категорий
Тонкие настройки прав доступа
Предпросмотр медиа файлов: FLV, IFLV, F4A, F4V, MP4, MP3, MOV и других...
Мультизагрузка файлов - SWFUploader
Добавление файлов с сервера
Подробности и история обновлений продукта в
этой теме
11.12.2009, 03:30
#2
Эксперт
Регистрация: 27.06.2006
Адрес: Петрозаводск
Сообщений: 222
Версия vB: 3.8.x
Пол:
Поблагодарил(-а): 90
Поблагодарили 691 раз(а) в 127 сообщениях
Репутация: Эксперт (854 )
Вот такой вариант набросал. Второе условие можно убрать, если слеши гарантированно присутствуют.
PHP код:
if ( $i = preg_match ( '#([\\\/]+).*([\\\/]?)$#iU' , $path , $matches ) AND $matches [ 1 ] != $matches [ 2 ])
$slash = $matches [ 1 ];
else if ( $i == 0 ) // Слешей в строке не обнаружено, но файл отделить нужно.
$slash = ( strtoupper ( substr ( PHP_OS , 0 , 3 )) == 'WIN' ? '\\' : '/' );
else
$slash = '' ;
Можно и без preg_match обойтись, движений побольше надо сделать, но выполняться, вероятно, будет быстрее.
11.12.2009, 03:45
#3
Эксперт
Регистрация: 19.05.2008
Сообщений: 1,461
Версия vB: 3.8.4
Пол:
Поблагодарил(-а): 621
Поблагодарили 1,124 раз(а) в 520 сообщениях
Репутация: Эксперт (1187 )
MDM , Вот спасибо. Никогда бы не додумался... наверно.
Ну раз пошла такая пьянка, то почему выражение $test = '\'; дает ошибку в php. Имеется ввиду, что как бы символ не закрыт кавычкой. Что php по умолчанию воспринимает \ как начало regexp токена?
11.12.2009, 03:51
#4
Эксперт
Регистрация: 27.06.2006
Адрес: Петрозаводск
Сообщений: 222
Версия vB: 3.8.x
Пол:
Поблагодарил(-а): 90
Поблагодарили 691 раз(а) в 127 сообщениях
Репутация: Эксперт (854 )
Цитата:
Сообщение от
SMak044
Что php по умолчанию воспринимает \ как начало regexp токена?
В этом случае PHP воспринимает кавычку как текст, а не как специальный символ.
google: экранирующий слеш.
Вот так правильно:
11.12.2009, 05:30
#5
k0t
Регистрация: 24.05.2005
Адрес: localhost
Сообщений: 16,882
Версия vB: 3.8.x
Пол:
Поблагодарил(-а): 1,766
Поблагодарили 11,323 раз(а) в 4,829 сообщениях
Репутация: Гуру (11527 )
а если без регекспов?
PHP код:
$path = getcwd ();
$path = str_replace ( '\\' , '/' , $path );
$pos = strrpos ( $path , '/' );
if( $pos < ( strlen ( $path )- 1 ))
{
$path = str_replace ( $path , $path . '/' , $path );
}
print $path ;
11.12.2009, 11:17
#6
Эксперт
Регистрация: 27.06.2006
Адрес: Петрозаводск
Сообщений: 222
Версия vB: 3.8.x
Пол:
Поблагодарил(-а): 90
Поблагодарили 691 раз(а) в 127 сообщениях
Репутация: Эксперт (854 )
kerk , тоже вариант.
У меня была задумка сравнить найденный в пути слеш с substr($path, -1) и подставить его при необходимости.
Кстати...
непонятен тайный смысл выражения:
PHP код:
$path = str_replace ( $path , $path . '/' , $path );
Проще ведь вот так:
11.12.2009, 13:19
#7
Эксперт
Регистрация: 19.05.2008
Сообщений: 1,461
Версия vB: 3.8.4
Пол:
Поблагодарил(-а): 621
Поблагодарили 1,124 раз(а) в 520 сообщениях
Репутация: Эксперт (1187 )
kerk , Ха! отличное решение. В памятки!
11.12.2009, 16:13
#8
k0t
Регистрация: 24.05.2005
Адрес: localhost
Сообщений: 16,882
Версия vB: 3.8.x
Пол:
Поблагодарил(-а): 1,766
Поблагодарили 11,323 раз(а) в 4,829 сообщениях
Репутация: Гуру (11527 )
Цитата:
Сообщение от
MDM
Проще ведь вот так
ну можно и так
как видишь, вариантов решения одной задачи множество
и чем дальше, тем проще и быстрей код
11.12.2009, 18:19
#9
k0t
Регистрация: 24.05.2005
Адрес: localhost
Сообщений: 16,882
Версия vB: 3.8.x
Пол:
Поблагодарил(-а): 1,766
Поблагодарили 11,323 раз(а) в 4,829 сообщениях
Репутация: Гуру (11527 )
хех =)
немного упростил и загнал в функцию
можно применять многократно
PHP код:
function get_slashpath ( $path )
{
$path = str_replace ( '\\' , '/' , $path );
$pos = strrpos ( $path , '/' );
if( $pos < ( strlen ( $path )- 1 ))
{
$path .= '/' ;
}
return $path ;
}
может оно и ненадо, т.к. все, что делает эта функция. это добавляет слэш в конец
выполнение
PHP код:
print get_slashpath ( '/apache/www' );
и
PHP код:
print get_slashpath ( '/apache/www/' );
вернет одинаковое значение
можно и так использовать, если нужен путь (со слэшем в конце) до дир. из которой исполняется скрипт
PHP код:
print get_slashpath ( getcwd ());
11.12.2009, 18:35
#10
Эксперт
Регистрация: 19.05.2008
Сообщений: 1,461
Версия vB: 3.8.4
Пол:
Поблагодарил(-а): 621
Поблагодарили 1,124 раз(а) в 520 сообщениях
Репутация: Эксперт (1187 )
kerk , Очень полезно, особенно когда надо проверить есть ли конкретные файлы в каталоге.
Опции темы
Опции просмотра
Линейный вид
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
Текущее время: 16:52 25.05.2012 . Часовой пояс GMT +4.