Intereting Posts
Переменные продукты WooCommerce: сохраняйте только «минимальную» цену с помощью специальной метки Ошибка SSL: как перенаправить https://www.domain.com на http://domain.com через .htaccess, чтобы избежать ошибки SSL Статус 21002 При проверке получения транзакции Crypt отличается от сервера, чем на локальной машине PHPExcel throws Fatal error: разрешенный размер памяти 134217728 байт исчерпан (пытался выделить 71 байт) Что такое буферизация вывода? Каков максимальный размер ключа для массива в PHP? Eclipse и Zend Debugger всегда ломаются в первой строке, несмотря на то, что эта опция не установлена Как получить содержимое xml узла в виде строки? Как я могу написать доступный класс во всем проекте? Как получить котировки акций с помощью Google Finance API? Используя PHP для отправки изображения в Cheezburger, json_decode не будет обрабатывать ответ fopen не будет открывать файлы по сети Динамически вставлять содержимое в pdf-файлы с помощью php Автоконфигурация служб Symfony 3.3

Получить базовый каталог текущего скрипта

Это URL моего скрипта: localhost/do/index.php

Я хочу переменную или функцию, которая возвращает localhost/do (что-то вроде $_SERVER['SERVER_NAME'].'/do' )

Пытаться:

 $url = $_SERVER['REQUEST_URI']; //returns the current URL $parts = explode('/',$url); print_r($parts); 

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

 $url = $_SERVER['REQUEST_URI']; //returns the current URL $parts = explode('/',$url); $dir = $_SERVER['SERVER_NAME']; for ($i = 0; $i < count($parts) - 1; $i++) { $dir .= $parts[$i] . "/"; } echo $dir; 

Это должно возвращать localhost/do/

 $_SERVER['SERVER_NAME'] . dirname($_SERVER['REQUEST_URI']); 

php имеет множество функций для синтаксического анализа строк, которые могут выполняться с помощью простых однострочных фрагментов
dirname () (который вы просили) и parse_url () (который вам нужен) среди них

 <?php echo "Request uri is: ".$_SERVER['REQUEST_URI']; echo "<br>"; $curdir = dirname($_SERVER['REQUEST_URI'])."/"; echo "Current dir is: ".$curdir; echo "<br>"; 

адресная строка в браузере

 http://localhost/do/index.php 

выход

 Request uri is: /do/index.php Current dir is: /do/ 

Я предлагаю не использовать dirname() . У меня было несколько проблем с несколькими сокращениями и неожиданными результатами. Именно поэтому я создал currentdir ():

 function currentdir($url) { // note: anything without a scheme ("example.com", "example.com:80/", etc.) is a folder // remove query (protection against "?url=http://example.com/") if ($first_query = strpos($url, '?')) $url = substr($url, 0, $first_query); // remove fragment (protection against "#http://example.com/") if ($first_fragment = strpos($url, '#')) $url = substr($url, 0, $first_fragment); // folder only $last_slash = strrpos($url, '/'); if (!$last_slash) { return '/'; } // add ending slash to "http://example.com" if (($first_colon = strpos($url, '://')) !== false && $first_colon + 2 == $last_slash) { return $url . '/'; } return substr($url, 0, $last_slash + 1); } 

Почему вы не должны использовать dirname ()

Предположим, что у вас есть image.jpg расположенное в images/ и у вас есть следующий код:

 <img src="<?php echo $url; ?>../image.jpg" /> 

Предположим теперь, что $url может содержать разные значения:

  • http://example.com/index.php
  • http://example.com/images/
  • http://example.com/images//
  • http://example.com/
  • и т.п.

Независимо от того, что он содержит, нам нужен текущий каталог, чтобы создать рабочий deeplink. Вы пытаетесь использовать dirname() и сталкиваетесь со следующими проблемами:

1.) Различные результаты для файлов и каталогов

файл
dirname('http://example.com/images/index.php') возвращает http://example.com/images

каталог
dirname('http://example.com/images/') возвращает http://example.com

Без проблем. Мы могли бы скрыть это:
dirname('http://example.com/images/' . '&') . '/' dirname('http://example.com/images/' . '&') . '/' возвращает http://example.com/images/

Теперь dirname() возвращает в обоих случаях нужный текущий каталог. Но у нас будут другие проблемы:

2.) Несколько кратных слэшей будут удалены
dirname('http://example.com//images//index.php') возвращает http://example.com//images

Конечно, этот URL-адрес плохо сформирован, но происходят множественные сокращения, и нам нужно действовать как браузеры, поскольку веб-мастера используют их для проверки их вывода. И, может быть, вам интересно, но все три изображения следующего примера загружены.

 <img src="http://example.com/images//../image.jpg" /> <img src="http://example.com/images//image.jpg" /> <img src="http://example.com/images/image.jpg" /> <img src="http://example.com/images/../image.jpg" /> 

Это причина, по которой вам следует сохранять несколько слэшей. Поскольку dirname() удаляет только несколько слэшей, я открыл биг-код .

3.) Корневой URL не возвращает корневой каталог
dirname('http://example.com') возвращает http:
dirname('http://example.com/') возвращает http:

4.) Корневой каталог возвращает относительный путь
dirname('foo/bar') возвращается .

Я бы ожидал / .

5.) Неправильные кодированные URL-адреса
dirname('foo/bar?url=http://example.com') возвращает foo/bar?url=http:

Все результаты теста:
http://www.programmierer-forum.de/aktuelles-verzeichnis-alternative-zu-dirname-t350590.htm#4329444

Когда я выполнял некоторые из этих ответов, я столкнулся с несколькими проблемами, поскольку я использую IIS, и мне также нужен полный URL-адрес с протоколом. Я использовал PHP_SELF вместо REQUEST_URI как dirname('/do/') PHP_SELF '/' (или '\' ) в Windows, когда вы хотите вернуть '/do/' .

 if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === 'off') { $protocol = 'http://'; } else { $protocol = 'https://'; } $base_url = $protocol . $_SERVER['SERVER_NAME'] . dirname($_SERVER['PHP_SELF']); 

Если вы хотите включить имя сервера, как я понял, то следующие фрагменты кода должны делать то, что вы просите:

 $result = $_SERVER['SERVER_NAME'] . dirname(__FILE__); $result = $_SERVER['SERVER_NAME'] . __DIR__; // PHP 5.3 $result = $_SERVER['SERVER_NAME'] . '/' . dirname($_SERVER['REQUEST_URI']); 

dirname предоставит вам часть каталога пути к файлу. Например:

 echo dirname('/path/to/file.txt'); // Outputs "/path/to" 

Получение URL-адреса текущего скрипта немного сложнее, но $_SERVER['REQUEST_URI'] вернет вам часть после имени домена (т. Е. Даст вам «/do/index.php»).

лучший способ – использовать функцию explode / implode (встроенный PHP), например, так

 $actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; $parts = explode('/',$actual_link); $parts[count($parts) - 1] = ""; $actual_link = implode('/',$parts); echo $actual_link; 

Мое предложение:

 const DELIMITER_URL = '/'; $urlTop = explode(DELIMITER_URL, trim(input_filter(INPUT_SERVER,'REQUEST_URI'), DELIMITER_URL))[0] 

Контрольная работа:

 const DELIMITER_URL = '/'; $testURL = "/top-dir"; var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); $testURL = "/top-dir/"; var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); $testURL = "/top-dir/test"; var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); $testURL = "/top-dir/test/"; var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); $testURL = "/top-dir/test/this.html"; var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); $testURL = "/top-dir/test.html"; var_dump(explode(DELIMITER_URL, trim($testURL, DELIMITER_URL))[0]); 

Выход теста:

 string(7) "top-dir" string(7) "top-dir" string(7) "top-dir" string(7) "top-dir" string(7) "top-dir" string(7) "top-dir"