Форум » Информационные технологии » РНР, JS: с чем их едят. » Ответить

РНР, JS: с чем их едят.

Xar Van Horn: Скрипт: ФАЙЛ .html <HTML><HEAD> <TITLE>XvH Chat</TITLE> </HEAD> <frameset cols="*,0" border=0> <!-- Измените сылку на скрипт программы чата --> <frame src="http://ваш-сервер/cgi-bin/chat/.cgi"> <frame src="" scrolling=no> </frameset> </html> ФАЙЛ .cgi #!/usr/bin/perl # The Script is Freeware XvH# ################################ $script_name = ".cgi"; # Имя скрипта $chatlist_file = "list"; # Имя файла сообщения $new_msg_top = 1; # Установите в 1 если хотите видеть новые сообщения вверху; внизу - "" $number_line = 18; # Число строк сообщений $updatefrequency = 20; # Количество секунд между обновлениями окна чата $addsecs = 0; # Корректировка времени $html_java = "JavaScript"; # "JavaScript" - структура JavaScript; чтоб использовался обычный HTML чат установите "" $html_meta = '<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">'; # кодировка (win) $body = 'body bgcolor="#333399" text="#ffffff" link="#C8C8C8" vlink="#C8C8C8" alink="#C8C8C8"'; # фон текста, обоев тега <body> $html_style = '<style type="text/css"><!-- a{color: #87cefa; text-decoration: none} a:hover{text-decoration: underline} --></style>'; # Каскадная таблица стилей # HTML -часть# ################################ # местное время $timestamp = time+$addsecs; # корректировка времени ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($timestamp); if ($hour < 10) {$hour = "0$hour";} if ($min < 10) {$min = "0$min";} if ($sec < 10) {$sec = "0$sec";} $date = "$hour:$min:$sec"; # get query string if ($ENV{'REQUEST_METHOD'} eq "GET") { $qs = $ENV{'QUERY_STRING'}; } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $qs, $ENV{'CONTENT_LENGTH'}); } my @split = split (/&/, $qs); foreach $split (@split) { ($query_key, $query_value) = split (/=/, $split); $query_value =~ tr/+/ /; $query_value =~ s/%([\dA-Fa-f][\dA-Fa-f])/ pack ("C", hex ($1))/eg; $query{$query_key} = $query_value; } &header; if ($qs eq "" or $query{'action'} eq "changint") { &welcome; } elsif ($query{'action'} eq "chat") { &create_nick if ($query{'login'} ne ""); # проверка Ника на $error &chat; } elsif ($query{'action'} eq "postmsg") { $text = &kill_special_chars($query{'sez1'}); # проверка введённого текста на стоп-символы &create_nick; # проверка Ника на $error &chat; } elsif ($query{'action'} eq "post") { &post; } else { &error; } sub header { # заголовок print "Content-type: text/html\n\n"; } sub welcome { # главная страница чата - фрэймы print <<"[END]"; <HTML><HEAD> $html_meta <TITLE>Chat</TITLE> </HEAD> <SCRIPT language="JavaScript" type="text/javascript"> <!-- var timemsg = '' var stl = '$html_style' var met = '$html_meta<meta http-equiv="expires" content="0"><meta http-equiv="pragma" content="no-cache">' var body = '<$body topmargin="4" >' var table_top = '<B><center><font face="Arial" color="#5153a8"><sup>Welcome to the JavaScript Lite Chat</sup></font></center></B><table border=0 width=100% bgcolor="#5153a8" align=center><tr><td><font size=2 face="Arial">' var table_end = '</font></td></tr></table></body>' var message = new Array for (var i=0; i<$number_line; i++) {message = ''} function head() { listen.document.write('<head>'+met+'<meta http-equiv="refresh" content="$updatefrequency; url=$script_name?action=chat&time_msg='+timemsg+'#end">'+stl+'</head>'+body+table_top) } function mess(newmsg) { var check = 1 for (var i=0; i<$number_line; i++) {if (message == newmsg) {check = 2}} if (check == 1) {for (var i=$number_line-2; i>=0; i--) {message[i+1] = message} message[0] = newmsg } } function wrt() { [END] if ($new_msg_top) { print "for (var i=0; i<$number_line; i++)"; # новые сообщения сверху } else { print "for (var i=$number_line-1; i>=0; i--)"; # новые сообщения снизу } print <<"[END]"; {listen.document.write(message)} listen.document.write(table_end) } function checksays() { var doc = post.document.FormPost doc.sez1.value = doc.sez.value doc.time_msg.value = returntime() doc.sez.value = '' doc.sez.focus() return true } function lasttime(ms) {timemsg = ms} function returntime() {return timemsg} //--> </script> [END] if ($query{'interface'} ne "2"){ print "<frameset cols=\"*,200\" border=0>\n"; # Интерфейс 1 } else { print "<frameset rows=\"*,70\" border=0>\n"; # Интерфейс 2 } print <<"[END]"; <frame src="$script_name?action=chat" name="listen"> <frame src="$script_name?action=post&login=$query{'login'}&interface=$query{'interface'}" name="post" scrolling=no> </frameset> </html> [END] } sub post { # форма отправки сообщений if ($query{'login'} ne ""){ &create_nick; # проверка Ника на $error } if ($query{'login'} ne "" and $error ne "ошибка" and $query{'interface'} eq "1"){ print <<"[END]"; <html><head> $html_meta <title>Chat-post2.1</title> </head> <$body topmargin="17" onLoad="javascript:document.FormPost.sez.focus();enter()"> <SCRIPT language=JavaScript type=text/javascript> <!-- function enter() { if (document.FormPost.sez.value.length > 400 ) { document.FormPost.sez.value = document.FormPost.sez.value.substring(0, 400); } setTimeout("enter()", 100); } //--> </SCRIPT> <table border=0 height="100%"> <tr valign=top><td> <center> <table border=0 bgcolor="#5153a8"> <tr><td><font size="+1" color="#FFFFFF"> <b><center>$query{'login'}:</b></font> <FORM METHOD=POST ACTION="$script_name" name="FormPost" target="listen" onsubmit="javascript:parent.checksays();sez.focus()"> <input type="hidden" name="action" value="postmsg"> <textarea name="sez" rows=7 cols=18 maxlength=350 onMouseOver="this.focus()"></textarea> <input type="hidden" name="login" value="$query{'login'}"> <input type="hidden" name="sez1" value=""> <input type="hidden" name="time_msg" value=""> <center><br> <table border=1><tr><td> <center><input type="submit" value=" Отправить "><p> <input type="reset" value="Очистить" onClick="javascript:sez.focus()"></center><br><p><br></Form> <FORM method="post" action="$script_name" target="_parent"> <input type="hidden" name="action" value="changint"> <input type="hidden" name="interface" value="2"> <input type="hidden" name="login" value="$query{'login'}"> <input type="submit" value="Change Interface" onClick="javascript:document.FormPost.sez.focus()"><br><p></td></tr> </table><p></td></tr> </table></Form></center> <hr><font size=-2>По всем вопросам относительно работы Чата пишите на <big><A HREF=mailto:chart\@mailru.com>chart\@mailru.com</A></big></font> <tr valign="bottom" align=center><td> <FORM method="post" action="$script_name" target="listen"> <input type="hidden" name="action" value="chat"> <input type="submit" value="Обновить окно" onClick="javascript:document.FormPost.sez.focus()"> </tr></td> </table></FORM> </body></html> [END] } elsif ($query{'login'} ne "" and $error ne "ошибка" and $query{'interface'} eq "2"){ print <<"[END]"; <html><head> $html_meta <title>Chat-post2.2</title> </head> <$body topmargin="17" onLoad="javascript:document.FormPost.sez.focus()"> <center> <table border=0 width=100%><tr><td> <font face=Arial color="#5153a8" size=-1>Привет посетителям!<font></td> <td><table border=0 bgcolor="#5153a8"> <tr><td><font size=+1 color="#FFFFFF"> <b>$query{'login'}:</font></td> <td><base target="listen"> <FORM METHOD=POST ACTION="$script_name" name="FormPost" target="listen" onsubmit="javascript:parent.checksays();sez.focus()"> <input type="hidden" name="action" value="postmsg"> <input type=text name="sez" size=45 maxlength=400 onMouseOver="this.focus()"></td> <input type="hidden" name="login" value="$query{'login'}"> <input type="hidden" name="sez1" value=""> <input type="hidden" name="time_msg" value=""> <center> <td> <table border=0><tr><td> <input type="submit" value="Ответить"></td><td> <input type=reset value="Очистить" onClick="javascript:sez.focus()"> </center></td></tr></form> </table></td></tr> </table></td> <td align=right> <FORM method="post" action="$script_name" target="_parent"> <input type="hidden" name="action" value="changint"> <input type="hidden" name="interface" value="1"> <input type="hidden" name="login" value="$query{'login'}"> <input type="submit" value="Change Interface" onClick="javascript:document.FormPost.sez.focus()"></td></tr> </td></tr> </table></form> </body></html> [END] } else { print <<"[END]"; <html><head> $html_meta <title>Chat-post1</title> </head> <$body topmargin=17 onLoad="javascript:document.FormPostEnter.login.focus()"> <table border=1><tr><td><form action="$script_name" method="post" name="FormPostEnter"> <b>Ваш Ник:</b></td></tr><tr><td><input type="text" name="login" size=20 maxlength=20></td></tr> <tr><td> <input type=hidden name="action" value="post"> <input type="hidden" name="interface" value="1"> <input type="submit" value="Войти"> </td></tr> </table></form> <center>$error</center> </body></html> [END] } } sub chat { # структура сообщений $scroll = ($new_msg_top) ? "" : "scroll(0,50000);"; # сообщения вверху или внизу if ($html_java eq "JavaScript") { print "<HTML><HEAD>$html_meta\n" ; print "<SCRIPT language='JavaScript' type='text/javascript'>\n"; print "parent.lasttime('$timestamp');\n"; print "parent.head();\n"; } else { print <<"[END]"; <HTML><HEAD> $html_meta <META HTTP-EQUIV="refresh" CONTENT="$updatefrequency"> <META HTTP-EQUIV="expires" CONTENT="0"><META HTTP-EQUIV="pragma" CONTENT="no-cache"> <title>Chat window</title> $html_style </HEAD> <$body topmargin="4"> <B><center><font face="Arial" color="#5153a8"><sup>Welcome to the Chat room!</sup></font></center></B> <table border=0 width=100% bgcolor="#5153a8" align=center><tr><td><font size=2 face="Arial"> [END] } if ($error ne "ошибка") { if(($text ne "") and ($text ne " ") and ($query{'login'} ne "")){ open (NEWMSGFILE, "<$chatlist_file"); open (NEWMSGFILE2, ">$chatlist_file.tmp") || &error("::open chatlist_file2 file failed::"); $element = "<!--$timestamp-->$date I <B>$query{'login'}:</B> $text<br><hr size=1>"; # структура сообщения print NEWMSGFILE2 "$element\n"; if ($html_java eq "JavaScript") { print "parent.mess('$element');$scroll\n"; # $parent = "parent.mess('$element');$scroll\n"; } else { print "$element\n"; } my $i = 1; while (<NEWMSGFILE>) { last if ($i >= $number_line); print NEWMSGFILE2; if ($html_java eq "JavaScript") { $_ =~ /(\d+)/; $timer = $1; chomp; # пишем только новые сообщения согласно времени $timer print "parent.mess('$_');$scroll\n" if ($timer >= $query{'time_msg'} and $query{'time_msg'} eq ""); } else { print; } $i++; } close NEWMSGFILE; close NEWMSGFILE2; rename("$chatlist_file.tmp", "$chatlist_file"); } else { open(MSGFILE, "<$chatlist_file"); my @msgfile = <MSGFILE>; if ($html_java eq "JavaScript") { @msgfile = reverse(@msgfile); foreach $element (@msgfile) { $_ =~ /(\d+)/; $timer = $1; last if ($timer < $query{'time_msg'} and $query{'time_msg'} ne ""); # выход из цикла если сообщение по времени - $timer - старое chomp $element; print "parent.mess('$element');$scroll\n"; } } else { print "@msgfile"; } close(MSGFILE); } } else { print "$error - Неверный Ник\n"; } if ($html_java eq "JavaScript") { print "parent.wrt();\n"; print "$scroll"; print "</script>\n" ; print "<A NAME=\"end\"></A>\n" if (!$new_msg_top); print "</HTML>"; } else { print <<"[END]"; </font></td></tr></table> </body></html> [END] } } sub create_nick { # проверка написания Ника # допустимые символы в Нике if (($query{'login'} !~ /^[1234567890йцукенгшщзхъэждлорпавыфячсмитьбюёЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮЁ_@\-\*\~\!\:\.]+$/g) && ($query{'login'} !~ /^[\w@\-\*\~\!\:\.]+$/g)) { $error = "ошибка"; # отсутствие в Нике букв или цифр } elsif (($query{'login'} !~ /[1234567890йцукенгшщзхъэждлорпавыфячсмитьбюёЙЦУКЕНГШЩЗХЪЭЖДЛОРПАВЫФЯЧСМИТЬБЮЁ]/) && ($query{'login'} !~ /[\w]/)) { $error = "ошибка"; # ограничение длинны ника (21 символов) } elsif ($query{'login'} =~ m/.{21,}/) { $error = "ошибка"; } } sub kill_special_chars { # проверка на стоп-символы # kill linebreaks $_[0] =~ s/\n/ /g; $_[0] =~ s/\r//g; # windows # ограничение длинны введённого текста - 400 символов $_[0] = substr($_[0],0,400)."..." if ($_[0] =~ m/.{400,}/); # Ограничение длинны отдельного слова скажем... длинной равной 100 символов @array = split /\s+/, $_[0]; foreach $element(@array) { $element_end = (length($element) > 100) ? "..." : ""; $element = substr($element,0,100).$element_end; } $_[0] = join (" ", @array); # kill ' $_[0] =~ s/\'/&\#39;/g; # kill html-tags $_[0] =~ s/</&lt;/g; $_[0] =~ s/>/&gt;/g; # установка одного пробела в начале строки $_[0] =~ s/\A/ /g; # http://* $_[0] =~ s/\s(http:\/\/.[^\ ]+)/ <A HREF=\"$1\" TARGET=\"_blank\">$1<\/A>/gi; $_[0] =~ s/\s(www\.[^\ ]+)/ <A HREF=\"http:\/\/$1\" TARGET=\"_blank\">$1<\/A>/gi; # ftp://* $_[0] =~ s/(\bftp:\/\/.[^\ ]+)/<A HREF=\"$1\" TARGET=\"_blank\">$1<\/A>/gi; # mailto:* $_[0] =~ s/([\w,\-,\.]+\@[\w,\-,\.]+\.\w{2,3})/\<a href=\"mailto:$1\"\>$1\<\/a\>/gi; # убираем лишние пробелы, заменяя их семейство одним $_[0] =~ tr/ / /s; return $_[0]; } sub error { # $_[0] - error_msg print <<"[END]"; <HTML><HEAD> $html_meta <TITLE>Chat - An Error Occured</TITLE> </HEAD> <$body> <H1>An Error Occured</H1> <B>Error Message: $_[0]<BR>Query_String: $qs</B> </BODY></HTML> [END] } ****************** Естественно, что строки с "#" это комменты. Краткие особенности структуры чата: В данном Чате показан один из путей встраивания в обычную HTML структуру некоторых элементов JavaScript для уменьшения передаваемых/принимаемых данных, что позволяет примерно в 3...5 раз снизить трафик. Структура чата слишком простая - без списка присутствующих, без приватов, базы данных зарегистрированных Ников - и служит лишь для демонстрации возможностей JavaScript. Установка: - размещаем файл .cgi к примеру в директорию "chat" вашего сайта скажем по адресу http://ваш-сервер/cgi-bin/chat/.cgi и файл .html - http://ваш-сервер/chat/.html - устанавливаем права доступа на файл .cgi: chmod 755 и chmod 775 на каталог чата /cgi-bin/chat - изменяем первую строку "#!/usr/bin/perl", "#!/bin/perl" и т.д., что там у вас - запускаем HTML страничку из окна броузера http://ваш-сервер/chat/.html (можно и непосредственно http://ваш-сервер/cgi-bin/chat/.cgi) Пользуйтесь на здоровье. Я не жадный. Имена файлам .cgi и .html придумайте сами. Успехов!

Ответов - 3

Vedmak: Как же я далек от сетевых технологий,типичный обыватель. Магистр,это не вы ,случайно,создали матрицу:) А если серьезно,то много ли времни займет обучение основам какого-нибудь сетевого языка программирования??

Xar Van Horn: Это смотря что за язык и как его изучать. самому - эт одно, а еси обучает кто знающий - другое дело.

Xar Van Horn: JavaScript распознает следующие типы велечин: Числа, типа 42 или 3.14159 Логические (Булевы), значения true или false Строки, типа "Howdy!" Пустой указатель, специальное ключевое слово, обозначающее нулевое значение Это относительно малый набор типов значений, или типов данных, которые позволяют вам выполнять функции в ваших приложениях. Не существует никакого явного различия между целыми числами и реально-оцененными числа. И при этом не существует явного типа данных date в Navigator. Однако, объект date и связанные встроенные функции позволяют вам обрабатывать данные. Объекты и функции - фундаментальные элементы в языке. Вы можете думать об объектах как об именнованных контейнерах для значений, и о функциях как о процедурах, которые ваше приложение может выполнять. Преобразование типов данных Тип переменной зависит от того, какой тип информации в ней хранится. JavaScript не является жестко типизированным языком. Это означает, что вы не должны точно определять тип данных переменной, в момент ее создания. Тип переменной присваивается переменной автоматически в течение выполнения скрипта. Так, например, вы можете определить переменную следующим образом: var answer = 42 А позже, вы можете присвоить той же переменной, например следующее значение: answer = "Thanks for all the fish..." Или рассмотрим следующее выражения: //пример var oneString="1" var oneInt=1 var oneConcatenate=oneString+oneInt // В результате получается "11" var oneAddition=oneInt+oneString // В результате получается 2 В первой операции сложения первый операнд является строкой. JavaScript предпологает, что производится операция с двумя строками. Когда JavaScript обнаруживает в качестве второго операнда целое число, он в соответствии со своими представлениями преобразует переменную в строку. Поскольку JavaScript свободно типизированный язык, то это не вызовет ошибки. Так как JavaScript не поддерживает никаких методов и свойств для определения типа текущего значения переменной, очень важно внимательноотслеживать типы переменных во избежание неожиданных результатов. Вообще, в выражениях, включающие числовые и строковые значения, JavaScript преобразовывает числовые значения в строковые. Например, рассмотрим следующие утверждение: x = "The answer is " + 42 y = 42 + " is the answer." Первое утверждение будет строка "The answer is - 42 ". Второе утверждение возвращает строку " 42 - The answer is". JavaScript предоставляет несколько специальных функций для управления строковыми и числовыми значениями: eval вычисляет строку, представляющая любые JavaScript литералы или переменные, преобразовывая ее в число. parseInt преобразовывает строку в целое число в указанном основании системы счисления, если возможно. parseFloat преобразовывает строку в число с плавающей точкой, если возможно. -------------------------------------------------------------------------------- Переменные Вы используете переменные, чтобы хранить значения в вашем приложении. Вы даете этим переменным имена, по которым вы ссылаетесь на них, и существуют некоторые правила, которым имена должны соответствовать. Идентификатор JavaScript или имя должны начаться с символа или символом подчеркивания ("_"); последовательность символов также могут быть цифры (0-9). Символы включают знаки с "A" до "Z" (верхнего регистра) и знаки с "a" до "z" (нижний регистр). JavaScript учитывает регистр. Некоторые примеры допустимых имен: Number_hits temp99 _name Область действия переменных Область действия переменных - то, где вы можете использовать их в скрипте. В JavaScript, существует две области действия, которые переменные могут иметь: Глобальная: Вы можете использовать переменную где-нибудь в приложении. Локальная: Вы можете использовать переменную внутри текущей функции. Чтобы объявить локальную переменную внутри функция, используйте ключевое слово var, например: var total = 0 Чтобы объявить глобальную переменную, объявите переменную назначения, которая просто присваивает значение переменной (или в функции или вне функции), например: total = 0 Лучше всего объявлять глобальные переменные в начале вашего скрипта, так, чтобы функции наследовали переменную и ее значение. -------------------------------------------------------------------------------- Литералы Литералы - способ, которым вы представляете значения в JavaScript. Установленные значения, которые вы буквально (literally) представляете в вашем источнике, и - не переменные. Примеры литералов включают: 42 3.14159 "Быть или не быть" Целые числа (Integers) Целыми называют числа вида 1, 164, 102390. Они могут быть выражены в десятичном (по основанию 10), шестнадцатеричном (по основанию 16), или восьмеричном (по основанию 8) представлении. Десятичный литерал целого числа состоит из последовательности цифр без ввода 0 (ноля). Целое число может быть выражено в восьмеричном или шестнадцатеричном скорее чем в десятиричное. Шестнацетеричные числа включают цифры 0-9 и буквы a-f и A-F, в JavaScript они записываются с комбинацией символов 0x или 0X (ноль-x) перед числом. Восмиричные числа включают только цифры 0-7 и в JavaScript записываются с ведущего нуля. Например, десятичное число 23 представляется в шестнадцатеричном виде как 0x17 и в восмеричном как 027 Литералы с плавающей точкой Литералы с плавающей точкой представляют собой дробные части целых чисел и должны включать в себя по крайней мере одну цифру и десятичную точку либо символ экспоненты ("е" или "Е"). В следующих примерах приведены различные варианты представления одного и того же числа: 3.1415927 31415927е-7 .31415927Е1 Логические Литералы Логические значения имеют только два значения, истинна (true) или ложь (false). В некоторых реализациях языка JavaScript 0 (false) и 1 (true) не могут быть использованы в качестве логических значений. Строки Строковые литералы - ноль или большее количество знаков, располеженные в двойных (") или одинарных (') кавычках. Строки должен быть разделены кавычками того же самого типа; то есть или обе одинарные кавычки или двойные кавычки. Использование обратной двойной черты "\" позволяет вставлять в строку специальные символы. Приведем примеры строковых литералов: "Blah" 'Blah' "1234" "one line \n another line" Специальные символы Вы можете использовать следующие специальные символы в строковых литаралах JavaScript: \b указывает возврат на один символ. \f указывает перевод страницы. \n указывает новую цифру(знак) линии. \r указывает возврат каретки. \t указывает cимвол табуляции. Символы Выхода Вы можете вставлять кавычки внутри строки, предшествуя им наклонной чертой влево. Это известно как выход кавычек. Например, document.write("\"Вам следует принять ванну\",- сказал доктор и наморщил нос.") выводит "Вам следует принять ванну", - сказал доктор и наморщил нос. -------------------------------------------------------------------------------- P.S. Далее в программе: "Выражения и операторы".




полная версия страницы