regex — получение частей URL в переполнении стека

Как я могу извлечь следующие части, используя функцию PHP:

  • Домен
  • Путь без файла
  • Файл
  • Файл с расширением
  • Файл без расширения
  • Схема
  • Порт
  • Запрос
  • Фрагмент
  • (добавьте любые другие, которые вы считаете полезными)

Ex.1
https://stackoverflow.com/users/test/login.php?q=san&и = пост # сверху

  • Домен (stackoverflow.com)
  • Путь без файла (/ users / test /)
  • Файл (login.php)
  • Расширение файла (.php)
  • Файл без расширения (логин)
  • Схема (https 🙂
  • Порт (возврат пустой строки)
  • Запрос (q = san&и = пост)
  • Фрагмент (вверху)

Пример: 2 stackoverflow.com/users/test/login.php?q=san&и = пост # сверху

  • Домен (stackoverflow.com)
  • Путь без файла (/ users / test /)
  • Файл (login.php)
  • Расширение файла (.php)
  • Файл без расширения (логин)
  • Схема (вернуть пустую строку)
  • Порт (возврат пустой строки)
  • Запрос (q = san&и = пост)
  • Фрагмент (вверху)

Пример: 3 /users/test/login.php?q=san&и = пост # сверху

  • Путь без файла (/ users / test /)
  • Файл (login.php)
  • Расширение файла (.php)
  • Файл без расширения (логин)
  • Запрос (q = san&и = пост)
  • Фрагмент (вверху)
  • Для оставшихся (вернуть пустую строку)

Пример: 4 / users / test / login? Q = san&и = пост # сверху

  • Путь без файла (/ users / test /)
  • Файл (логин)
  • Расширение файла (возврат пустой строки)
  • Файл без расширения (логин)
  • Запрос (q = san&и = пост)
  • Фрагмент (вверху)
  • Для оставшихся (вернуть пустую строку)

Пример: 5 вход? Q = san&и = пост # сверху

  • Файл (логин)
  • Расширение файла (возврат пустой строки)
  • Файл без расширения (логин)
  • Запрос (q = san&и = пост)
  • Фрагмент (вверху)
  • Для оставшихся (вернуть пустую строку)

Пример: 6? Q = san&и = сообщение

  • Запрос (q = san&и = пост)
  • Для оставшихся (вернуть пустую строку)

Я проверил функцию parse_url, но не возвращает то, что мне нужно. Поскольку я новичок в PHP, мне было трудно. Если у вас есть идеи, пожалуйста, ответьте.

Заранее спасибо.

-3

Решение

PHP обеспечивает parse_url функция.

Эта функция анализирует URL и возвращает ассоциативный массив, содержащий
любой из различных компонентов URL, которые присутствуют.

Эта функция не предназначена для проверки заданного URL, она только ломает
это в перечисленные выше части. Частичные URL также принимаются,
parse_url() старается разобрать их правильно.


Вы можете увидеть тестовые случаи выполнено здесь.

$urls = array(
"https://stackoverflow.com/users/test/login.php?q=san&u=post#top",
"/users/test/login.php?q=san&u=post#top",
"?q=san&u=post#top",
"login.php?q=san&u=post#top",
"/users/test/login?q=san&u=post#top",
"login?q=san&u=post#top");
foreach( $urls as $x ) {
echo $x . "\n";
var_dump( parse_url($x) );
}
1

Другие решения

Я использую это, чтобы найти рут и webroot

<?php

/**
* @brief get paths from the location where it was executed.
*/
class PathHelper {
/**
* @brief This function tries to determine the FileSystem root of the application. (needs to be executed in the root)
* @return string
*/
public static function locateRoot($file) {
$dir = dirname($file);
/** FIX Required for WINDOWS * */
$dir = preg_replace('/\\\\/', '/', $dir);
$dir = preg_replace('/\\\/', '/', $dir);
return $dir;
}

/**
* @brief This function tries to determine the WebRoot. (needs to be executed in the root)
* @return string
*/
public static function locateWebroot($file) {
$docroot = $_SERVER['DOCUMENT_ROOT'];
$dir = dirname($file);
if ($dir == $docroot) {
$webroot = "";
} else {
$webroot = substr_replace($dir, '', 0, strlen($docroot));
}
/** FIX Required for WINDOWS * */
$webroot = preg_replace('/\\\\/', '/', $webroot);
$webroot = preg_replace('/\\\/', '/', $webroot);
return $webroot;
}
}

Я установил это как константу, чтобы я мог использовать его во всем приложении.

Например:

Для меню вы можете сделать что-то вроде этого:

   // the requested url
$requestedUrl = $_SERVER['REQUEST_URI'];

// remove the webroot from the requested url
$requestedUrl = str_replace(WEBROOT, "", $_SERVER['REQUEST_URI']);

// take away the / if they still exist at the beginning
$requestedUrl = ltrim($requestedUrl, "/");

Тогда я получил это:
index.php? Контроллер = Пользователь&Действие = Обзор

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

Редактировать: вероятно, лучше использовать parse_url (). Я не привык ко всем функциям в PHP, но если ничего не работает, то это, по крайней мере, запасной вариант.

1

По вопросам рекламы [email protected]