Parse str

Всем привет в этой небольшой статье мы с вами познакомимся с функциями parse_url() и parse_str() которые позволяют разбивать url строку на составляющие элементы. Под составляющими элементами я понимаю (протокол, хост, порт, параметры и т.п)

Допустим у нас есть следующая url строка:

$url_str = "https://webfanat.com:8083/article_id?id=136#136";

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

var_dump(parse_url($url_str));

В данную функцию мы передаем нашу url строку и на выходе получаем ассоциативный массив содержащий следующие пары свойств и значений.

scheme => https

host => webfanat.com

port => 8083

path=> /article_id

query=> id=136

fragment=>136

Как видите вся наша url строка была разбита на составные ее части. Теперь нам достаточно просто обратится к любому ключу массива для получения его содержимого. К примеру мы хотим получить номер порта.

var_dump(parse_url($url_str)['port']);    

В результате нам вернется номер порта. Если нам требуется получить одно или несколько значений фрагментов url строки мы можем в функцию parse_url() передать второй аргумент в виде надстройки.

Пример, получение параметров адресной строки.

var_dump(parse_url($url_str, PHP_URL_QUERY));

Как видите здесь для получения параметров адресной строки мы воспользовались константой PHP_URL_QUERY. Остальные фрагменты url строки мы можем получать точно также по аналогии(PHP_URL_SCHEME — scheme, PHP_URL_PORT — port и т.п.)

Давайте рассмотрим теперь функцию parse_str(). Данная функция позволяет обрабатывать строку параметров url.

$url_str = "https://webfanat.com:8083/article_id?id=136&new=1#136";  $query = parse_url($url_str, PHP_URL_QUERY);  parse_str($query, $output);  var_dump($output);

В саму функцию мы передаем строку параметров url и переменную($output) в которую будет возвращен результат. Отмечу что наличие второго аргумента обязательно!

В итоге у нас в переменную $output записывается ассоциативный массив содержащий пары свойств и значений параметров url строки.

var_dump($output['id']);// значение параметра id
var_dump($output['new']);// значение параметра new    

В общем функцию parse_str() мы можем применять к любым строкам такого формата(?свойство=значение&свойство=значение)

На этом данная статья подошла к концу. Не забывайте оставлять комментарии.

Удачи!

webfanat.com

Если на хостинге из разряда последних упомянутых применять сборку страниц с помощью JS, тогда часто возникает необходимость в JS-разборе строки URL-запроса, в вылавливании оттуда имен и значений параметров. Делать это можно по-разному. Я хочу предложить читателю свой простой и удобный способ, уходящий корнями в PHP.

В настройках PHP есть такой «не очень хороший» параметр, как register_globals. Почему «не очень хороший»? А потому, что начиная с версии PHP 4.2.0 его значение по умолчанию есть OFF, а до этого — было ON. Вот и пришлось помучиться немного, пока разобрался, почему сайт, работающий у меня на локале под PHP 4.0.3, не хотел работать на сервере под PHP 4.3.6. А параметр-то этот управляет разрешением на регистрацию в глобальном пространстве имен скрипта Environment-, GET-, POST-, Cookie-, и Server-переменных. Вот и суть проблемы оказалась в том, что строка URL-запроса не обрабатывалась автоматически перед запуском скрипта, и переменные из URL не были определены. Обошлось все как нельзя лучше. Вместо того, чтобы всюду заменять $var_from_url на $_SERVER[«var_from_url»], сделал так: в начале скрипта поставил строчку parse_str($_SERVER[«QUERY_STRING»]) — для GET-переменных эффект тот же, что и при register_globals=ON.


Функция parse_str(s [, v]) занимается тем, что «парсит» (разбирает) переданную ей строку, как если бы это была строка запроса из URL. Разбор заключается в том, что в пространство имен скрипта (либо, если указан, в массив v) вносятся переменные из строки s, и им присваиваются соотв. значения. Туманно… Вот пример:

<? $s = "eyes=hazel&age=28"; parse_str($s); echo "eyes: ".$eyes."; age: ".$age; parse_str($s,$v); echo "nv['eyes']: ".$v['eyes']. "; v['age']: ".$v['age']; ?>

А недавно работал с JS, и возникла у меня мысль, что в JS просто ужасно неудобно без такой функции, как parse_str. Избегая дальнейших измышлений, сразу привожу работающий пример, содержащий написанную функцию:

Файл 1.htm - его открываем в браузере: <html> <body> <form action="2.htm" method="get"> x = <input type="text" name="x"> y = <input type="text" name="y"> <input type="submit" value="submit"> </form> </body> </html>
Файл 2.htm - открывается при отправке формы из 1.htm <html> <head> <script language="JavaScript1.2"> /* второй аргумент по умолчанию опущен. доступ к нему - arguments[1] */ function parse_str( s) { var a = s.split(/&|=/); switch (arguments.length) { case 1: for ( var i=0; i<a.length; i++) { eval(a[i] + "="" + unescape(a[++i]) +"""); } break; case 2: for ( var i=0; i<a.length; i++) arguments[1][a[i]] = unescape(a[++i]); } } /*переменные вносятся в глобальное пространство имен*/ parse_str(location.search.slice(1)); var v = new Array(); /* переменные вносятся в массив v.    
дексы массива - имена переменных */ parse_str(location.search.slice(1),v); </script> </head> <body> <script language="JavaScript"> document.write("x = " + x + "; y = " + y); document.write("<br>v['x'] = " + v['x'] + "; v['y'] = " + v['y']); </script> </body> </html>

P.S.parse_str() в этом варианте корректно обрабатывает только строки, не содержащие в значениях параметров escape-нутых кириллических символов и прочей дребедени. Для поддержки кириллических и, вообще, UNICODE-значений параметров необходимы некоторые изменения кода.

adminbook.ru

if you need custom arg separator, you can use this function. it returns parsed  query as associative array.

<?php

/**
* Parses http query string into an array
*
* @author Alxcube <alxcube@gmail.com>
*
* @param string $queryString String to parse
* @param string $argSeparator Query arguments sepa.
="default">PHP_QUERY_RFC1738
) {
       
$result             = array();
       
$parts              = explode($argSeparator, $queryString);

        foreach ($parts as $part) {
                list(
$paramName, $paramValue)   = explode('=', $part, 2);


                switch ($decType) {
                        case
PHP_QUERY_RFC3986:
                               
$paramName      = rawurldecode($paramName);
                               
$paramValue     = rawurldecode($paramValue);
                                break;

                        case PHP_Q.
                             
$paramValue     = urldecode($paramValue);
                                break;
                }
               

                if (preg_match_all('/[([^]]*)]/m', $paramName, $matches)) {
                .
"keyword">));
                       
$keys           = array_merge(array($paramName), $matches[1]);
                } else {
                       
$keys           = array($paramName);
                }
               
            .
            if (
$index === '') {
                                if (isset(
$target)) {
                                        if (
is_array($target)) {
                                               
$intKeys        = array_filter
class="keyword">($intKeys) ? max($intKeys)+1 : 0;
                                        } else {
                                               
$target = array($target);
                                               
$index  = 1;
                                        }
                                } else {
                                       
$target         = array();
                                       
$index          = 0;
                                }
                        } elseif (isset(
$target[$index]) && !is_array($target[$index])) {
                               
$target[$index] = array($target[$index]);
                        }

                        $target         = &$target[$index];
                }

                if (is_array($target)) {
                       
$target[]   = $paramValue;
                } else {
                       
$target     = $paramValue;
                }
        }

        return $result;
}

?>

php.net


You May Also Like

About the Author: admind

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

Adblock
detector