Парсинг строки для FTP-соединения

Распростанённый формат передачи настроек FTP-соединения - это ftp://user:password@host:port/path/, где обязательным является только host. Но для работы с FTP надо разбирать эту строку. Я написал себе небольшую функцию для этого.

UPD: Когда я писал это, то забыл о том, что есть стандартная функция parse_url. Зато моя подставляет логин, пароль, порт, если они не указаны, что удобно для подключения к FTP-серверам с анонимным доступом.

PHP:
  1. /**
  2. * Parse FTP-connection string
  3. *
  4. * @param string $url like ftp://user:password@host:port/path/
  5. * @return array hash(login, password, host, port, path)
  6. */
  7. function parseFtpUrl($url) {
  8.     $result = array(
  9.         'login' => 'anonymous',
  10.         'password' => 'nobody@nobody.com',
  11.         'host' => '',
  12.         'port' => 21,
  13.         'path' => '',
  14.     );
  15.  
  16.     if (preg_match('#^ftp://([^:@]+)?(:([^@]+))?@?([^:/]*)(:([^/]+))?(/(.*))?$#i', $url, $m)) {
  17.         if (!empty($m[1])) $result['login'] = $m[1];
  18.         if (!empty($m[3])) $result['password'] = $m[3];
  19.         if (!empty($m[4])) $result['host'] = $m[4];
  20.         if (!empty($m[6])) $result['port'] = $m[6];
  21.         if (!empty($m[8])) $result['path'] = rtrim($m[8], '/');
  22.     }
  23.  
  24.     return $result;
  25. }

Ограничение - неправильно разбирает, если в имени пользователя содержится @. Если вы знаете, что будут такие логины и всегда будет указываться пароль, то надо заменить регулярное выражение на #^ftp://([^:]+)?(:([^@]+))?@?([^:/]*)(:([^/]+))?(/(.*))?$#i (убралась собачка в недопустимых символах в имени пользователя).


Понравилось?

  1. Подпишись через RSS
  2. Расскажи о http://php.southpark.com.ua друзьям.
    Все способы хороши: ICQ, E-mail, свой блог, комментарий в чужом блоге или сообщение на форуме
  3. Добавь статью на news2.ru, Хабрахабр или в закладки

Огромное спасибо!

Похожие статьи

И не стесняйтесь комментировать - у меня стоит плагин, который убирает rel="nofollow" у людей, которые написали больше 5 комментариев.

RSS feed | Trackback URI

9 комментариев »

Comment by roTuKa
2008-01-10 15:01:33

А если попробовать

$url = 'ftp://username:password@hostname/path/dir';
print_r(parse_url($url));

 
Comment by roTuKa
2008-01-10 15:23:21

Ура! Я изобрёл велосипед. :)

@roTuKa: спасибо, забыл о ней

 
 
Comment by Флэшка Subscribed to comments via email
2008-01-21 19:01:08

Инфо просто супер как раз искал, а тут все есть, спасибо.

 
Comment by nickon
2008-03-05 06:25:26

Велосипед удался :smile: :smile: :smile: и всё же parse_url будет получше ...

parse_url - 0.000155925750732 sec.
parseFtpUrl - 0.000374794006348 sec.

 
Comment by Yaroslav Vorozhko Subscribed to comments via email
2008-03-11 16:19:25

не согласен...
так как parse_url - это универсальная функция, хоть и не без багов,
а parseFtpUrl все таки только для ftp uri.

 
Comment by Tamerlan Subscribed to comments via email
2008-03-28 20:51:40

Ууу.... всегда хотел разобраться в регулярных выражениях.... пошёл разбирать.
Был бы очень благодарен если Вы написали статейку по это делу. :)

 
Comment by Yaroslav Vorozhko Subscribed to comments via email
2008-04-02 10:33:21

Привет Tamerlan,
по регулярным выражениям миллион статей, а гугл в данном случае помошник номер 1 :)
http://www.google.com.ua/search?q=perl+%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5+%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F&sourceid=navclient-ff&ie=UTF-8&rlz=1B3GGGL_ruUA240UA240&aq=t

 
 
Имя (required)
E-mail (required - never shown publicly)
URL
Текст комментария
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> in your comment.