Функция для каждой подпапки в PHP

Я новичок в PHP и не могу понять, как это сделать:

$link = 'http://www.domainname.com/folder1/folder2/folder3/folder4';

$domain_and_slash = http://www.domainname.com . '/';

$address_without_site_url = str_replace($domain_and_slash, '', $link);

foreach ($folder_adress) {
// function here for example
echo $folder_adress;
}

Я не могу понять, как получить адрес $folder_adress.

В приведенном выше случае я хочу, чтобы функция повторила эти четыре:

  • папка1
  • папка1/папка2
  • папка1/папка2/папка3
  • папка1/папка2/папка3/папка4

Ссылка $ будет иметь разное количество подпапок...


person Hakan    schedule 26.03.2011    source источник
comment
Это ваш сайт или? Ссылки могут быть переписаны, что означает отсутствие физической папки. Если вы пытаетесь это сделать на других сайтах, я предлагаю вам покинуть PHP прямо сейчас :)   -  person Dejan Marjanović    schedule 27.03.2011
comment
Спасибо за все ваши ответы. Webarto - Да, это мой сайт. Благодаря Stackoverlfow я создал функцию кэширования, которая превратит все мои php-страницы в html-страницы, сжатые с помощью gzip. Работает просто прелесть :)   -  person Hakan    schedule 27.03.2011


Ответы (7)


Это доставит вас туда. Некоторые вещи, которые вы могли бы изучить подробнее: explode, parse_url, обрезать. Взглянув на документы этих функций, вы лучше поймете, как обрабатывать URL-адреса и как работает приведенный ниже код.

$link = 'http://www.domainname.com/folder1/folder2/folder3/folder4';
$parts = parse_url($link);
$pathParts = explode('/', trim($parts['path'], '/'));

$buffer = "";                                                                                                                                                                                                                                                                 
foreach ($pathParts as $part) {
    $buffer .= $part.'/';

    echo $buffer . PHP_EOL;
}

/*
Output:

folder1/
folder1/folder2/
folder1/folder2/folder3/
folder1/folder2/folder3/folder4/
*/
person ChrisR    schedule 26.03.2011

Вам следует взглянуть на explode() функция

array explode ( string $delimiter , string $string [, int $limit ] )

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

Используйте / в качестве разделителя.

person Haza    schedule 26.03.2011

Это то, что вы ищете:

$link = 'http://www.domainname.com/folder1/folder2/folder3/folder4';
$domain_and_slash = 'http://www.domainname.com' . '/';
$address_without_site_url = str_replace($domain_and_slash, '', $link);
// this splits the string into an array
$address_without_site_url_array = explode('/', $address_without_site_url);
$folder_adress = '';
// now we loop through the array we have and append each item to the string $folder_adress
foreach ($address_without_site_url_array as $item) {
  // function here for example
  $folder_adress .= $item.'/';
  echo $folder_adress;
}

Надеюсь, это поможет.

person Martin    schedule 26.03.2011

Попробуй это:

$parts = explode("/", "folder1/folder2/folder3/folder4");
$base = "";
for($i=0;$i<count($parts);$i++){
    $base .= ($base ? "/" : "") . $parts[$i];
    echo $base . "<br/>";
}
person Mārtiņš Briedis    schedule 26.03.2011

Я бы использовал preg_match() для метода регулярного выражения:

$m = preg_match('%http://([.+?])/([.+?])/([.+?])/([.+?])/([.+?])/?%',$link)

// $m[1]: domain.ext
// $m[2]: folder1
// $m[3]: folder2
// $m[4]: folder3
// $m[5]: folder4
person Billy Moon    schedule 26.03.2011
comment
Я не стал бы. Я думаю, что регулярные выражения здесь излишни. А в вашем примере, что, если каталогов больше или меньше четырех? - person Wiseguy; 27.03.2011

1) Подход со списком: используйте split для получения массива папок, а затем объедините их в цикле.

2) Строковый подход: используйте strpos с параметром смещения, который изменяется от 0 до 1 + последняя позиция, где была найдена косая черта, затем используйте substr для извлечения части строки папки.

РЕДАКТИРОВАТЬ:

<?php
  $folders = 'folder1/folder2/folder3/folder4';


  function fn($folder) {
    echo $folder, "\n";
  }

  echo "\narray approach\n";
  $folder_array = split('/', $folders);
  foreach ($folder_array as $folder) {
    if ($result != '')
      $result .= '/';
    $result .= $folder;
    fn($result);
  }

  echo "\nstring approach\n";
  $pos = 0;
  while ($pos = strpos($folders, '/', $pos)) {
    fn(substr($folders, 0, $pos++));
  }
  fn($folders);
?>
person Amadan    schedule 26.03.2011
comment
Спасибо за Ваш ответ. Можете ли вы привести пример из кода выше? - person Hakan; 27.03.2011
comment
Нет, под сплитом он имеет в виду сплит :) но да, взрыв был бы лучше. Давно не занимался PHP... - person Amadan; 27.03.2011

Если бы у меня было время, я мог бы работать чище. Но это работает и помогает найти идеи: http://codepad.org/ITJVCccT.

Используйте parse_url, обрезать, взрывать, array_pop и взорваться

person JAAulde    schedule 26.03.2011