regex — preg_replace удаляет косую черту и после

Ну, я хочу удалить слеш и остальную часть URL после доменного имени. в этом коде:

$url = $_POST['url'];
$result = preg_replace('#/[^/]*$#', '', $url);
echo $result;

он удалит косую черту и после нее (/index.php), но только когда URL будет примерно таким:

Http: //site.domain/index.php

но в этом:

Http: //site.domain/index/test

или больше косых черт, это только удалит последний косой черты и след (/ тест).

Я хочу удалить первую косую черту после домена:

Пример:

Http: //site.domain/index/test/test/test/test/test/test

Удалить:

/ Индекс / тест / тест / тест / тест / тест / тест

Результат:

Http: //site.domain

Я не знаю, как определить первый слеш после домена и следов.
Вторая проблема, когда URL-адрес:

Http: //test.domain

он удалит /test.com, но я никогда не хочу этого, я хочу, чтобы у URL не было косой черты после доменного имени, НЕ удаляйте вторую косую черту из http: //! ну, я знаю, что я должен определить, что удалить первую косую черту после домена или, с другой стороны, первую косую черту в пути или php self.

0

Решение

Как насчет:

$result = preg_replace('#((?:https?://)?[^/]*)(?:/.*)?$#', '$1', $url);

Это сохранит все, что находится до первой косой черты (после http: //, если присутствует)

3

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

$result = preg_replace('%((https?://)?.*?)/.*$%', '$1', $url);

Объяснение:

((https?://)?.*?)/.*$Match the regex below and capture its match into backreference number 1 «((https?://)?.*?)»
Match the regex below and capture its match into backreference number 2 «(https?://)?»
Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
Match the character string “http” literally «http»
Match the character “s” literally «s?»
Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
Match the character string “://” literally «://»
Match any single character that is NOT a line break character «.*?»
Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Match the character “/” literally «/»
Match any single character that is NOT a line break character «.*»
Between zero and unlimited times, as many times as possible, giving back as needed (greedy) «*»
Assert position at the end of the string, or before the line break at the end of the string, if any «$»

$1

Insert the text that was last matched by capturing group number 1 «$1»
0

Вы используете не тот инструмент. Это работа для функции parse_url(). Используйте его для разбора URL-адреса на компоненты (схема, пользователь + проход, хост + порт, путь, строка запроса, фрагмент), затем выберите нужные вам фрагменты и соедините их, чтобы получить нужный URL-адрес.

$url = $_POST['url'];

// Parse the URL into pieces
$pieces = parse_url($url);

// Put some of the pieces back together to get a new URL
// Scheme ('http://' or 'https://')
$newUrl = $pieces['scheme'].'://';
// Username + password, if present
if (! empty($pieces['user'])) {
$newUrl .= $pieces['user'];
if (! empty($pieces['pass'])) {
$newUrl .= ':'.$pieces['pass'];
}
$newUrl .= '@';
}
// Hostname
$newUrl .= $pieces['host'];
// Port, if present
if (! empty($pieces['port'])) {
$newUrl .= ':'.$pieces['port'];
}

// That't all. Ignore path, query string and url fragment
echo($newUrl);

В качестве примечания, составная часть может быть легко выполнена с помощью функции http_build_url (); к сожалению, эта функция обеспечивается Расширение HTTP который не в комплекте с PHP. Он должен быть установлен отдельно, что означает, что если код не размещен на вашем собственном сервере, он, скорее всего, недоступен.

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