В прошлый раз (Тестирование регулярных выражений) мы начали писать web приложение для проверки регулярных выражений. Мы разобрались с его назначением, функциями и структурой. Теперь посмотрим, что собой представляют его отдельные компоненты.
Сначала рассмотрим клиентскую часть. Для нашего приложения нужна одна html страница с формой для ввода данных (назовем ее index.html) и файл с JavaScript функцией (scripts.js), которая будет отправлять запрос и обновлять страницу. Кроме того, что бы немного улучшить дизайн мы добавим таблицу стилей (styles.css). Такой подход позволяет убрать все правила оформления в отдельный файл и не загромождать ими html страницу.
Теперь посмотрим разметку в файле index.html.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru"> <head> <title>Проверка регулярных выражений</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="styles.css" /> <script src="prototype.js" type="text/javascript"></script> <script src="scripts.js" type="text/javascript"></script> </head> <body> <p class="title">Тестирование регулярных выражений</p> <form id="expForm" action="#" method="post"> <p> <label for="regexp">Регулярное выражение</label> <input type="text" name="regexp" id="regexp" class="txt" value="/(d{1,3})-?([d-]+)/" /> </p> <p> <label for="searchText">Текст</label> <textarea name="searchText" id="searchText" rows="10" class="txt"> 525-11-65 346-1-346</textarea> </p> <p> <label for="case">Учитывать регистр</label> <input type="checkbox" name="case" id="case" checked="checked" /> </p> <p> <input type="button" name="search" id="search" value="Поиск" onClick="analyseText()" class="btn" /> </p> <p class="comment">Примечание: необходимо ввести Perl-совместимое регулярное выражение (например, "/[abc]+$/") и текст, в котором нужно выполнить поиск по этому выражению. Подробнее почитать о правилах составлении регулярных выражений можно <a href="http://www.php.net/manual/ru/ref.pcre.php">здесь</a>.</p> </form> <div id="results"> Для анализа текста с помощью регулярного выражения нажмите кнопку "Поиск" </div> <div id="footer"> <p><a href="https://www.simplecoding.org">Почитать описание</a></p> <p><a href="https://www.simplecoding.org">Автор: Стаценко Владимир</a></p> </div> </body> </html>
Как видите, все довольно просто. В первую очередь мы указываем тип документа, его кодировку, заголовок страницы и т.п. В строке 7 мы подключаем таблицу стилей, а в строках 8 и 9 – библиотеку для работы с JavaScript и нашу функцию, которая выполняет Ajax запрос. В нашем приложении мы используем одну из самых лучших JS библиотек – prototype. Использование библиотеки немного увеличивает время первоначальной загрузки страницы (т.к. будет загружаться файл prototype.js), но позволяет значительно упростить работу с Ajax (и не только с ним). Описание этой библиотеки естественно выходит далеко за рамки этой статьи, поэтому я остановлюсь только на тех компонентах, которые мы будем использовать. Подробнее узнать о prototype можно на сайте www.prototypejs.org или из многочисленных статей.
Вернемся к нашей странице. Она условно разделена на 4 части: заголовок (между тегами <p class=»title»> и </p>), форма для ввода данных (<form id=»expForm»…> и </form>), результаты поиска (<div id=»results»>) и хвостовик со ссылками (<div id=»footer»>).
Обратите внимание, что все поля формы содержат значения по умолчанию, отсутствует поле «submit», а параметр action=»#». Т.е. сама форма данные никуда не отправляет. Отправку запроса выполняет функция analyseText()
при нажатии на кнопку «Поиск» (событие onClick
, строка 30).
Сама функция находится в файле scripts.js:
function analyseText() { //читаем значения введенные в поля var e = $('regexp').value; var t = $('searchText').value; var c = $('case').checked; //формируем строку с параметрами запроса var pars = $H({exp:e, text:t, textcase:c}).toQueryString(); //отправляем ajax запрос new Ajax.Updater("results", "analyser.php", {method:"post", parameters:pars}); }
Теперь разберем работу функции. Использование prototype позволило сократить код до минимума. Сначала мы читаем данные, введенные в поля формы, формируем хеш-таблицу и преобразуем ее в строку с параметрами запроса (строки 3-7). Затем мы создаем объект Ajax.Updater
который отправляет запрос серверу, читает результат и вставляет его между тегами <div id=»results»>…</div>
Первый параметр, который указывается при создании объекта это id блока в который будет вставлен результат запроса. В следующем параметре мы указываем тип запроса («post»), а в последнем – строку с параметрами.
На таблице стилей я подробно останавливаться не буду. Дизайн нашего приложения очень простой. С помощью цвета и рамок выделены 3 основные раздела сайта (форма, блок с результатами и «хвостовик»).
body { background-color: #EDEDED; margin: 0; padding: 2em 2em 2em 2em; } p.title { color: #734600; text-align: center; font-family: Tahoma, sans-serif; font-size: 140%; } #expForm { color: #126000; font-family: Verdana, sans-serif; font-size: 90%; font-weight: bold; border: solid 1px #000; margin: 0; padding: 1em 1em 1em 1em; background-color: #FCFCDB; } #expForm .txt { width: 400px; } #expForm p { clear: both; } #expForm p.comment { font-size: 80%; font-weight: normal; padding: 0 1em 0 1em; color: grey; font-family: Verdana, sans-serif; } #expForm p label { float: left; width: 25%; } #expForm .btn { margin: 0 0 0 25%; border: solid 1px #126000; font-size: 120%; font-family: Tahoma, sans-serif; color: #126000; } #results { margin: 2em 0 0 0; padding: 1em 1em 1em 1em; border: solid 1px #000; background-color: #DFFFD8; font-size: 90%; font-family: Tahoma, sans-serif; color: #472A01; } .bold { font-weight: bold; }#footer { border: solid 1px #000; background-color: #F7E7EB; font-size: 100%; font-family: Verdana, sans-serif; margin: 2em 0 0 0; padding: 0.5em 0.5em 0.5em 0.5em; } #footer p { text-align: center; font-size: 90%; margin: 0; padding: 0; } #footer p a { text-decoration: none; } #footer p a:hover { color: #ff0000; }
Единственный момент, на который стоит обратить внимание – это расстановка элементов формы. Для того, чтобы расположить элементы формы в две колонки с фиксированной шириной мы для каждого элемента label
устанавливаем директиву float: left
(стр 42), которая «вырывает» элемент из потока документа и смещает его влево. При этом следующий элемент будет обтекать label справа. Директива clear: both
, установленная для каждого тега <p> (стр 30), восстанавливает нормальный поток элементов в документе. Таким образом, каждый следующий параграф будет расположен под предыдущим.
Все. Клиентская часть нашего приложения закончена.
В следующий раз мы напишем серверную часть нашего приложения.
Посмотреть работающее приложение можно здесь.
Постовой