No Image

Php домен из url

СОДЕРЖАНИЕ
1 просмотров
11 марта 2020

Что я хочу

Я хочу получить от URL часть domain так что с http://example.com/ -> example.com

Примеры:

Я нашел некоторые связанные вопросы в stackoverflow но ни один из них не был именно тем, что я искал.

Спасибо за любую помощь!

Для этого не нужно использовать регулярное выражение. PHP имеет встроенную функцию для этого. Используйте parse_url() :

Предполагается, что http:// префиксы все.

Это похоже на регулярное выражение из theraccoonbear, но с поддержкой доменов HTTPS.

Поскольку parse_url не возвращает ключ хоста при отсутствии схемы в $url .

Вот мое быстрое и грязное решение.

Я не тестировал его, но он должен захватывать что-либо между http:// и первой косой чертой.

Мне нужно получить доменное имя из URL-адреса. Следующие примеры должны возвращать google.com :

Аналогично, все URL-адреса должны возвращать google.co.uk .

Я не решаюсь использовать регулярные выражения, потому что что-то вроде domain.com/google.com может возвращать неверные результаты.

Как я могу получить домен верхнего уровня, используя PHP? Это необходимо для работы на всех платформах и хостах.

Вы можете сделать это:

Лучший способ, которым я могу думать, – это отобразить все TLD, которые вы хотите обработать, поскольку некоторые TLD могут быть сложными (co.uk).

домены верхнего уровня и домены второго уровня могут иметь длину 2 символа, но зарегистрированный субдомен должен иметь длину не менее 3 символов.

EDIT: из-за комментария pjv я узнал, что австралийские доменные имена являются исключением, поскольку они позволяют 5 TLD в качестве SLD (com, net, org, asn, id) example: somedomain.com.au. Я предполагаю, что com.au является государственным доменным именем, которое "разделяет". так что технически "com.au" все равно будет "базовым доменом", но это не полезно.

EDIT: существует 47 952 возможных трехбуквенных имени домена (шаблон: [a-zA-Z0-9] [a-zA-Z0-9 -] [a-zA-Z0-9] или 36 * 37 * 36) в сочетании с 8 наиболее распространенными TLDS (com, org и т.д.), У нас есть 383 616 возможностей – даже без добавления во весь диапазон TLD. Однобуквенные и двухбуквенные имена доменов все еще существуют, но недействительны в будущем.

в google.com – "google" является субдоменом "com" ​​

в google.co.uk – "google" является субдоменом "co", который, в свою очередь, является субдоменом "uk" или доменом второго уровня, так как "co" также является действительным верхом -областной домен

на www.google.com – "www" является субдоменом "google" , который является субдоменом "com" ​​

"co.uk" НЕ является допустимым хостом, потому что нет действительного имени домена

исходя из этого предположения, эта функция вернет правильный "basedomain" почти во всех случаях, не требуя "карты url".

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

РЕДАКТИРОВАТЬ: вы должны передать доменную строку в качестве URL-адреса с его протоколом (http://, ftp://и т.д.) или parse_url() не будет считать его действительным URL-адресом (если вы не хотите изменить код на ведут себя по-другому)

Читайте также:  В каких словах выделенная часть является окончанием

если вам нужно быть точным использованием fopen или curl , чтобы открыть этот URL: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

затем прочитайте строки в массиве и используйте это для сравнения частей домена

EDIT: разрешить австралийские домены:

ВАЖНЫЕ ДОПОЛНИТЕЛЬНЫЕ ПРИМЕЧАНИЯ: я не использую эту функцию для проверки доменов. Это общий код, который я использую только для извлечения базового домена для сервера, на котором он запущен, из глобального $_SERVER[‘SERVER_NAME’] для использования в различных внутренних сценариях. Учитывая, что я когда-либо работал на сайтах в США, я никогда не сталкивался с австралийскими вариантами, о которых спрашивал pjv. Это удобно для внутреннего использования, но это далеко от полного процесса проверки домена. Если вы пытаетесь использовать его таким образом, я рекомендую не использовать слишком много возможностей для сопоставления недопустимых доменов.

(PHP 4, PHP 5, PHP 7)

parse_url — Parse a URL and return its components

Description

This function parses a URL and returns an associative array containing any of the various components of the URL that are present. The values of the array elements are not URL decoded.

This function is not meant to val >parse_url() tries its best to parse them correctly.

Parameters

The URL to parse. Invalid characters are replaced by _.

Specify one of PHP_URL_SCHEME , PHP_URL_HOST , PHP_URL_PORT , PHP_URL_USER , PHP_URL_PASS , PHP_URL_PATH , PHP_URL_QUERY or PHP_URL_FRAGMENT to retrieve just a specific URL component as a string (except when PHP_URL_PORT is given, in which case the return value will be an integer ).

Return Values

On seriously malformed URLs, parse_url() may return FALSE .

If the component parameter is omitted, an associative array is returned. At least one element will be present within the array. Potential keys within this array are:

  • scheme – e.g. http
  • host
  • port
  • user
  • pass
  • path
  • query – after the question mark ?
  • fragment – after the hashmark #

If the component parameter is specified, parse_url() returns a string (or an integer , in the case of PHP_URL_PORT ) instead of an array . If the requested component doesn’t exist within the given URL, NULL will be returned.

Changelog

Version Description
5.4.7 Fixed host recognition when scheme is omitted and a leading component separator is present.
5.3.3 Removed the E_WARNING that was emitted when URL parsing failed.
5.1.2 Added the component parameter.

Examples

Example #1 A parse_url() example

var_dump ( parse_url ( $url ));
var_dump ( parse_url ( $url , PHP_URL_SCHEME ));
var_dump ( parse_url ( $url , PHP_URL_USER ));
var_dump ( parse_url ( $url , PHP_URL_PASS ));
var_dump ( parse_url ( $url , PHP_URL_HOST ));
var_dump ( parse_url ( $url , PHP_URL_PORT ));
var_dump ( parse_url ( $url , PHP_URL_PATH ));
var_dump ( parse_url ( $url , PHP_URL_QUERY ));
var_dump ( parse_url ( $url , PHP_URL_FRAGMENT ));
?>

Читайте также:  При какой температуре отклеивать тачскрин

The above example will output:

Example #2 A parse_url() example with missing scheme

// Prior to 5.4.7 this would show the path as "//www.example.com/path"
var_dump ( parse_url ( $url ));
?>

The above example will output:

Notes

This function may not give correct results for relative URLs.

This function is intended specifically for the purpose of parsing URLs and not URIs. However, to comply with PHP’s backwards compatibility requirements it makes an exception for the file:// scheme where triple slashes (file:///. ) are allowed. For any other scheme this is invalid.

See Also

  • pathinfo() – Returns information about a file path
  • parse_str() – Parses the string into variables
  • http_build_query() – Generate URL-encoded query string
  • dirname() – Returns a parent directory’s path
  • basename() – Returns trailing name component of path
  • » RFC 3986

User Contributed Notes 41 notes

[If you haven’t yet] been able to find a simple conversion back to string from a parsed url, here’s an example:

function unparse_url ( $parsed_url ) <
$scheme = isset( $parsed_url [ ‘scheme’ ]) ? $parsed_url [ ‘scheme’ ] . ‘://’ : ” ;
$host = isset( $parsed_url [ ‘host’ ]) ? $parsed_url [ ‘host’ ] : ” ;
$port = isset( $parsed_url [ ‘port’ ]) ? ‘:’ . $parsed_url [ ‘port’ ] : ” ;
$user = isset( $parsed_url [ ‘user’ ]) ? $parsed_url [ ‘user’ ] : ” ;
$pass = isset( $parsed_url [ ‘pass’ ]) ? ‘:’ . $parsed_url [ ‘pass’ ] : ” ;
$pass = ( $user || $pass ) ? " $pass @" : ” ;
$path = isset( $parsed_url [ ‘path’ ]) ? $parsed_url [ ‘path’ ] : ” ;
$query = isset( $parsed_url [ ‘query’ ]) ? ‘?’ . $parsed_url [ ‘query’ ] : ” ;
$fragment = isset( $parsed_url [ ‘fragment’ ]) ? ‘#’ . $parsed_url [ ‘fragment’ ] : ” ;
return " $scheme$user$pass$host$port$path$query$fragment " ;
>

Here is utf-8 compatible parse_url() replacement function based on "laszlo dot janszky at gmail dot com" work. Original incorrectly handled URLs with user:pass. Also made PHP 5.5 compatible (got rid of now deprecated regex /e modifier).

$parts = parse_url ( $enc_url );

if( $parts === false )
<
throw new InvalidArgumentException ( ‘Malformed URL: ‘ . $url );
>

foreach( $parts as $name => $value )
<
$parts [ $name ] = urldecode ( $value );
>

I have coded a function which converts relative URL to absolute URL for a project of mine. Considering I could not find it elsewhere, I figured I would post it here.

The following function takes in 2 parameters, the first parameter is the URL you want to convert from relative to absolute, and the second parameter is a sample of the absolute URL.

Currently it does not resolve ‘../’ in the URL, only because I do not need it. Most webservers will resolve this for you. If you want it to resolve the ‘../’ in the path, it just takes minor modifications.

function relativeToAbsolute ( $inurl , $absolute ) <
// Get all parts so not getting them multiple times 🙂
$absolute_parts = parse_url ( $absolute );
// Test if URL is already absolute (contains host, or begins with ‘/’)
if ( ( strpos ( $inurl , $absolute_parts [ ‘host’ ]) == false ) ) <
// Define $tmpurlprefix to prevent errors below
$tmpurlprefix = "" ;
// Formulate URL prefix (SCHEME)
if (!(empty( $absolute_parts [ ‘scheme’ ]))) <
// Add scheme to tmpurlprefix
$tmpurlprefix .= $absolute_parts [ ‘scheme’ ] . "://" ;
>
// Formulate URL prefix (USER, PASS)
if ((!(empty( $absolute_parts [ ‘user’ ]))) and (!(empty( $absolute_parts [ ‘pass’ ])))) <
// Add user:port to tmpurlprefix
$tmpurlprefix .= $absolute_parts [ ‘user’ ] . ":" . $absolute_parts [ ‘pass’ ] . "@" ;
>
// Formulate URL prefix (HOST, PORT)
if (!(empty( $absolute_parts [ ‘host’ ]))) <
// Add host to tmpurlprefix
$tmpurlprefix .= $absolute_parts [ ‘host’ ];
// Check for a port, add if exists
if (!(empty( $absolute_parts [ ‘port’ ]))) <
// Add port to tmpurlprefix
$tmpurlprefix .= ":" . $absolute_parts [ ‘port’ ];
>
>
// Formulate URL prefix (PATH) and only add it if the path to image does not include ./
if ( (!(empty( $absolute_parts [ ‘path’ ]))) and ( substr ( $inurl , 0 , 1 ) != ‘/’ ) ) <
// Get path parts
$path_parts = pathinfo ( $absolute_parts [ ‘path’ ]);
// Add path to tmpurlprefix
$tmpurlprefix .= $path_parts [ ‘dirname’ ];
$tmpurlprefix .= "/" ;
>
else <
$tmpurlprefix .= "/" ;
>
// Lets remove the ‘/’
if ( substr ( $inurl , 0 , 1 ) == ‘/’ ) < $inurl = substr ( $inurl , 1 ); >
// Lets remove the ‘./’
if ( substr ( $inurl , 0 , 2 ) == ‘./’ ) < $inurl = substr ( $inurl , 2 ); >
return $tmpurlprefix . $inurl ;
>
else <
// Path is already absolute. Return it 🙂
return $inurl ;
>
>

Читайте также:  В чем назначение экспресс стилей

// Define a sample absolute URL
$absolute = "http://" . "user:pass@example.com:8080/path/to/index.html" ; // Just evading php.net spam filter, not sure how example.com is spam.

/* EXAMPLE 1 */
echo relativeToAbsolute ( $absolute , $absolute ) . "
" ;
/* EXAMPLE 2 */
echo relativeToAbsolute ( "img.gif" , $absolute ) . "
" ;
/* EXAMPLE 3 */
echo relativeToAbsolute ( "/img.gif" , $absolute ) . "
" ;
/* EXAMPLE 4 */
echo relativeToAbsolute ( "./img.gif" , $absolute ) . "
" ;
/* EXAMPLE 5 */
echo relativeToAbsolute ( "../img.gif" , $absolute ) . "
" ;
/* EXAMPLE 6 */
echo relativeToAbsolute ( "images/img.gif" , $absolute ) . "
" ;
/* EXAMPLE 7 */
echo relativeToAbsolute ( "/images/img.gif" , $absolute ) . "
" ;
/* EXAMPLE 8 */
echo relativeToAbsolute ( "./images/img.gif" , $absolute ) . "
" ;
/* EXAMPLE 9 */
echo relativeToAbsolute ( "../images/img.gif" , $absolute ) . "
" ;

?>

OUTPUTS:
http :// user:pass@example.com:8080/path/to/index.html
http :// user:pass@example.com:8080/path/to/img.gif
http :// user:pass@example.com:8080/img.gif
http :// user:pass@example.com:8080/path/to/img.gif
http :// user:pass@example.com:8080/path/to/../img.gif
http :// user:pass@example.com:8080/path/to/images/img.gif
http :// user:pass@example.com:8080/images/img.gif
http :// user:pass@example.com:8080/path/to/images/img.gif
http :// user:pass@example.com:8080/path/to/../images/img.gif

Sorry if the above code is not your style, or if you see it as "messy" or you think there is a better way to do it. I removed as much of the white space as possible.

Комментировать
1 просмотров
Комментариев нет, будьте первым кто его оставит

Это интересно
Adblock detector