Декодирование HTML-форм с помощью метода POST
Следующий скрипт очень напоминает только что обсуждавшийся, за исключением того, что данный скрипт использует метод POST для посылки данных формы скрипу CGI. Метод POST дает директиву броузеру послать данные формы, используя стандартный вход скрипта, а не строку запросов. Полезность метода POST заключается в том, чтоон может обрабатывать большие объемы данных, тогда как метод GET ограничен пространством переменной сервера, а также длиной URL броузера. Для чтения данных со стандартного ввода скрипт может вызвать функцию sys-read с нужным числом байт. Размер строки запроса в байтах содержится в переменной окружения CONTENT_LENGTH. После того как скрипт прочел строку запросов, дальнейшая обработка данных оказывается очень похожей на рассмотренную в предыдущем примере. Для того чтобы сделать, этот скрипт более коротким, обработка строки запросов осуществляется с помощью несколько более сложного подхода:
($cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):); $content_length = $ENV(CONTENT_LENGTH); if (!definet($query) || $query eq "") { # сгенерируем форму print <<FORM; Content-type: text/html <HTML> <HEAD><TITLE>Sample POST Form </TITLE></HEAD> <BODY> What is your query? <P> <FORM METHOD="POST" ACTION="$cgi_script"> A checkBox. <BR> <INPUT TYPE="checkbox" NAME="chek" VALUE="on"><P> A radio button set. <BR> <INPUT TYPE="radio" NAME="button" VALUE="1"> 1<BR> <INPUT TYPE="radio" NAME="button" VALUE="2"> 2<BR> <INPUT TYPE="radio" NAME="button" VALUE="3"> 3<P> A data entry field<BR> <INPUT NAME="field"><P> Send the data.<BR> <INPUT TYPE="submit"> </FORM> </HTML> FORM } else { # распечатаем результаты print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>POST Form Result</TITLE></HEAD>\n" print "<BODY>\n"; print "Your query values:<P>\n"; @fields = split("&", $query); forech (@field) { /([^=](.*)/ && do { local ($filed, $value) = ($1, $2); $query{$field} = &decode($value); } } print "Check Box: $query{check}<BR>\n"; print "Radio Button: $query{button}<BR>\n"; print "Data Field:", &html($query{field}), "<BR>\n"; print "<HTML>\n"; } sub decode{ local ($value) = @_; $value =~ s/\+/ /g; $value =~ s/%([0-9A-H]{2})/pack("C",hex($1))/eg; return $value; } sub html { local ($value) = @_; $value =~ s/</</g; $value =~ s/>/>/g; return $value" }
Этот скрипт использует одно регулярное выражение для анализа всех значений полей в строке запроса:
/([^=](.*)/ && do { local ($filed, $value) = ($1, $2); $query{$field} = &decode($value); }
Вместо того чтобы присваивать значения каждого запроса отдельной переменной. Данная программа хранит все запросы в ассоциативном массиве. В свою очередь скрипт может индексировать массив, используя нужные имена полей. Обратите внимание на сочетание [^=] в регулярном выражении. В данном контексте знак (^) неявляется якорем, указывающим на начало строки, как это было в предыдущем примере. В данном случае этот знак служит отрицанием для знака [=]. В таком качестве регулярное выражение может быть прочитано так: <соответствует одному или более символам, не включая знак равенства затем соответствует знаку равенства и затем соответствует всем остающимся, символам>.
1 2 3 4 5
8 8 8
| |