parse_url_all — Расширение базового функционала или Фабрика по производству велосипедов

Для своих нужд я когда-то давно написал функцию, полностью разбирающую переданный в нее url «на запчасти» и возвращающий массив.

Когда писал ее тогда и не подозревал, сколько уже на эту тему было написано функций, и даже классов! Но за время использования к собственной функции успел привыкнуть. Теперь вот делюсь, забирайте, если кому-то надо.

Итак, чем же отличается мой велосипед, от приведенных во множестве на странице мануала на php.net?

Первое: я не использую регулярные выражения. Признаться они меня вообще пугают, и особого понимания не вызывали (разве что в 1% случаев и это не один из них).

То есть парсинг всего этого добра реализован через встроенные функции: parse_url, parse_str, pathinfo и explode.

Второе: вы можете получить любую часть строкой, указав второй необязательный параметр (без использования констант вида: PHP_URL_SCHEME, PHP_URL_HOST, etc).

Третье: моя функция еще и делит хост по доменам (хотя еще ни разу не пришлось это использовать).

Код самой функции приведен ниже:

    /**
    Ключи результирующиго массива:
    - scheme - например, http
    - host
    - domains - массив доменов по уровням начиная с нуля
    - domain1, domain2, etc. - домены по уровням, начиная с домена первого уровня
    - port
    - user
    - pass
    - path
    - query - запрос, после знака вопроса ?
    - fragment -фрагмент, после знака хэша #
    - а также параметры адресной строки, те, что попадут в глобальный массив $_GET
    - dirname
    - basename
    - extension
    **/

function parse_url_all($URL,$GET='')
    {

        $PARSED_URL = array();

        $PARSED_URL=parse_url($URL);
        $PARSED_ALL=$PARSED_URL;

        if (isset($PARSED_ALL['host']))
        {
            $DOMAINS = explode('.',$PARSED_ALL['host']);
            $DOMAINS = array_reverse($DOMAINS);
            $PARSED_ALL['domains'] = $DOMAINS;

            $i = 1;
            foreach($DOMAINS as $d)
            {
                $PARSED_ALL['domain'.$i] = $d;
                $i++;
            }
        }

        if (isset($PARSED_URL['path']))
        {
            $PARSED_PATH=pathinfo($PARSED_URL['path']);
            $PARSED_ALL=array_merge($PARSED_ALL,$PARSED_PATH);
        }

        if (isset($PARSED_URL['query']))
        {
            parse_str($PARSED_URL['query'],$PARSED_STR);
            $PARSED_ALL=array_merge($PARSED_ALL,$PARSED_STR);
        }

        if ($GET=='')
            return $PARSED_ALL;
        elseif ($GET=='_GET')
            return $PARSED_STR;
        else
        {
            if (isset($PARSED_ALL[$GET]))
                return $PARSED_ALL[$GET];
            else
                '';
        }
    }

Вот результат работы функции над произвольным url:
print_r(parse_url_all('https://www.nadvoe.org.ua/sites/coding/someaddress.php.html?param1=1&param2=2#and_get_hash'));

Array
(
    [scheme] => https
    [host] => www.nadvoe.org.ua
    [path] => /sites/coding/someaddress.php.html
    [query] => param1=1&param2=2
    [fragment] => and_get_hash
    [domains] => Array
        (
            [0] => ua
            [1] => org
            [2] => nadvoe
            [3] => www
        )

    [domain1] => ua
    [domain2] => org
    [domain3] => nadvoe
    [domain4] => www
    [dirname] => /sites/coding
    [basename] => someaddress.php.html
    [extension] => html
    [filename] => someaddress.php
    [param1] => 1
    [param2] => 2
)

В общем сам я этой функцией пользуюсь, чаще всего извлекаю доменное имя для ссылок. Это удобно делать инлайново:

<a href="<?=$link?>"><?=parse_url_all($link,'host')?></a>
Полезно(0)Бесполезно(0)

Добавить комментарий