parse_str PHP в JavaScript

Если на хостинге из разряда последних упомянутых применять сборку страниц с помощью 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-значений параметров необходимы некоторые изменения кода.