Web - кодинг: JavaScript:


Parse_str: из PHP в JS



  Автор: Александр Рябов
  Источник:

- Сэнсэй объяснил мне несколько лет назад, - внезапно промолвил водитель.
- Что объяснил?
- Телефон Бога.
Я перевел дух - так, чтобы он не слышал. Кто-то из нас явно сходит с ума. Я? Или, может быть, он?
- И что же, он объяснил его только вам - и, наверное, под страшным секретом?
- Именно так. Только мне и по большому секрету. Замечательный человек... А что - вы тоже хотите знать?
- Если это возможно, - вымолвил я.
- Ну ладно, слушайте. Токио, 945...
- Секундочку! - попросил я, достал из кармана ручку с блокнотом и записал номер.
Харуки Мураками. "Охота на овец"


В серии статей товарища ;) Путяка были рассмотрены некоторые моменты JS, позволяющие выполнять сборку страницы на стороне пользователя, как если бы это выполнялось на стороне сервера с использованием серверных скриптов. Тема, безусловно, заслуживает внимания. Ведь, даже не смотря на то, что сегодня уже есть бесплатные хостинги с SSI и PHP - все они вставляют свою рекламу. Те же хостинги, на которых реклама отсутствует - не предоставляют возможность серверного скриптования.

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

Александр Рябов. Сентябрь 2004, Украина.
ryabov@ua.fm






При перепечатке любого материала с сайта, видимая ссылка на источник www.warayg.narod.ru и все имена, ссылки авторов обязательны.

© 2005