У меня есть текстовое поле на моем сайте, где люди могут отправлять URL-адреса. В большинстве случаев ввод неправильного URL выглядит так:
http://www.website.com?id=1
http://www.website.com/#/gls
http://www.website.com/post/test
Но я хочу, чтобы они указали свой базовый URL-адрес: http://www.website.com
Как я могу добиться этого, учитывая, что их URL-адрес хранится в $url
переменная?
У меня есть некоторые идеи, но я не думаю, что это очень хорошее решение. Например я думал при разделении домена после «.» и после этого получить расширение домена как-то без остального кода useles.
Вы могли бы использовать parse_url
вместо регулярного выражения, чтобы вынуть нужные вам части и сравнить их с тем, что они ввели, вот так:
// Get each part of the URL
$parts = parse_url($url);
// Rebuild the URL with only the scheme and domain (Without path, fragment, query string etc.)
$expected = $parts['scheme'] . '://' . $parts['host'];
// Compare the expected URL with what they user has entered.
if ($expected != $url) {
// Do something
}
Вы можете использовать PHP parse_url()
функция с PHP_URL_HOST
параметр.
Вот так:
parse_url($url, PHP_URL_HOST);
Это вернется www.example.com
для URL http://www.example.com/test
,
Кроме того, чтобы включить схему, вы можете попробовать следующее:
parse_url($url, PHP_URL_SCHEME) . "://" . parse_url($url, PHP_URL_HOST);
Это вернется http://www.example.com
для URL http://www.example.com/test
,
Если вы хотите использовать регулярные выражения (как вы предложили с тегом) о возврате раздела перед первым /
(кроме того, в http://
) или же #
или же ?
любой из которых являются недопустимыми символами в базовом URL? Любая часть URL после базы должна начинаться с одного из этих символов.
Вот так:
preg_match("/^http:\/\/[^\/\?\#]+/", $url)
Эта версия работает с https.
Первая скобка будет захватывать базовый URL.
preg_match("/^(https?:\/\/.+)(\/|#|\?|)/U", $url, $anArray)
// Access to the base url
$anArray[1]