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-значений параметров необходимы некоторые изменения кода.