Главная Случайная страница


Полезное:

Как сделать разговор полезным и приятным Как сделать объемную звезду своими руками Как сделать то, что делать не хочется? Как сделать погремушку Как сделать так чтобы женщины сами знакомились с вами Как сделать идею коммерческой Как сделать хорошую растяжку ног? Как сделать наш разум здоровым? Как сделать, чтобы люди обманывали меньше Вопрос 4. Как сделать так, чтобы вас уважали и ценили? Как сделать лучше себе и другим людям Как сделать свидание интересным?


Категории:

АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника






Метасимволы





Одним из самых важных метасимволов является символ обратного слэша ('\'). Если в регулярном выражении встречается этот символ, то парсер рассматривает символ, непосредственно следующий за ним двояко:

· если следующий символ имеет какое-либо специальное значение, то он теряет это свое специальное значение и рассматривается как обычный символ. Это совершенно необходимо для того, чтобы иметь возможность вставлять в строку специальные символы, как обычные. Например метасимвол '.', в обычном режиме означает " любой единичный символ ", а '\.' означает просто точку. Также можно лишить специального значения и сам этот символ: '\\'.

· если следующий символ не имеет никакого специального значения, то он может получить такое значение, будучи соединенным с символом '\'. К примеру символ 'd' в обычном режиме воспринимается просто как буква, однако, будучи соединенной с обратным слэшем ('\d') становится метасимволом, означающим " любая цифра ".

 

Существует множество символов, которые образуют метасимволы в паре с обратным слэшем. Как правило, подобные пары используются для того, чтобы показать, что на этом месте в строке должен находиться символ, с кодом, который не имеет соответствующего ему изображения или же символ, принадлежащий какой-то определенной группе символов. Некоторые наиболее употребительные метасимволы приведены в табл. 2.

 

Таблица 2. Наиболее употребительные метасимволы.

Метасимвол Значение
Метасимволы для задания символов, не имеющих изображения
\n Символ перевода строки (код 0x0A)
\r Символ возврата каретки (код 0x0D)
\t Символ табуляции (код 0x09)
\xhh Вставка символа с шестнадцатиричным кодом 0xhh, например \x41 вставит латинскую букву 'A'
Метасимволы для задания групп символов
\d Цифра (0-9)
\D Не цифра (любой символ кроме символов 0-9)
\s Пустой символ (обычно пробел и символ табуляции)
\S Непустой символ (все, кроме символов, определяемых метасимволом \s)
\w "Словесный" символ (символ, который используется в словах, обычно все буквы, все цифры и знак подчеркивания)
\W Все, кроме символов, определяемых метасимволом \w

 

Приведем несколько простейших примеров для понимания того, о чем идет речь. Сразу оговоримся, что примеры несколько громоздки и некрасивы, но лишь потому, что в них не использованы метасимволы, о которых еще речь впереди и которые сделали бы примеры намного проще.

 

Пример 25. Регулярные выражения

/\d\d\d/ -любое трехзначное число ('123', '719', '001')

/\w\s\d\d/ - буква, пробел (или табуляция) и двузначное число ('A 01', 'z 45', 'S 18')

/\d and \d/ -любая из следующих строк: '1 and 2', '9 and 5', '3 and 4'.

 

 

Синтаксис регулярных выражений имеет средства для определения собственных подмножеств символов. Например, может понадобиться задать условие, что в этом месте строки должна находиться шестнадцатиричная цифра или еще что-то подобное. Для описания таких подмножеств применяются символы квадратных скобок ' [] '. Квадратные скобки, встреченные внутри регулярного выражения считаются одним символом, который может принимать значения, перечисленные внутри этих скобок.

Есть небольшая тонкость в том, как работают метасимволы внутри квадратных скобок. Дело в том, что в синтаксисе регулярных выражений существует еще множество метасимволов, но практически все они работают только вне секций описаний подмножеств. Единственные метасимволы, которые работают внутри этих секций это:

· Обратный слэш ('\'). Т.е. все метасимволы из приведенной ранее таблицы будут работать.

· Минус ('-'). Используется для задания набора символов из одного промежутка (например все цифры могут быть заданы как '0-9')

· Символ '^'. Если этот символ стоит первым в секции задания подмножества символов (и только в этом случае!) он будет рассматриваться как символ отрицания. Т.о. можно задать все сиволы, которые не описаны в данной секции.

 

Несколько примеров, чтобы было понятно, как это работает:

 

Regexp Комментарии
[0-9A-Fa-f] Цифра в шестнадцатиричной системе счисления
[\dA-Fa-f] То же самое, но с использованием метасимвола
[02468] Четная цифра
[^\d] Все, кроме цифр (аналог метасимвола \D)
[a^b] Любой из символов 'a', 'b', '^'. Заметьте, что здесь символ '^' не имеет какого-либо специального значения, потому что стоит не на первой позиции внутри квадратных скобок.

 

Теперь необходимо рассмотреть еще несколько метасимволов. Как уже было сказано ранее, все они работают только вне секций описаний подмножеств символов (вне квадратных скобок).

Символы '^' и '$'. Они использутся для того, что того, чтобы указать парсеру регулярных выражений на то, чтобы он обратил внимание на положение искомого текста в строке. Символ '^' указывает, что искомый текст должен находиться в начале строки, символ '$' наоборот, указывает, что искомый текст должен находиться в конце строки. Посмотрим, как это работает на примере:

Допустим, у нас есть текст:

12 aaa bbbaaa 27 cccaaa aaa 45

и регулярное выражение для поиска чисел в этом тексте: /\d\d/m (не обращайте пока внимания на модификатор). Поиск по этому регулярному выражению вернет нам 3 значения: '12', '27', '45'. Теперь ограничим поиск, указав, где именно внутри строки должен располагаться текст: /^\d\d/m. Здесь результат будет только один - '12', потому что только это число располагается в начале строки. Аналогично, регулярное выражение /\d\d$/m вернет результат '45'.

Символ точки '.'. Этот метасимвол указывает, что на данном месте в строке может находиться любой символ (за исключением символа перевода строки). Очень удобно использовать его, если вам нужно "пропустить" какую-нибудь букву в слове при проверке. Например регулярное выражение /.bc/ найдет в тексте и 'abc' и 'Abc' и 'Zbc' и '5bc'.

Символ вертикальной черты '|'. Используется для задания списка альтернатив. Например регулярное выражение:

/(красное |зеленое) яблоко/

Найдет в тексте все словосочетания 'красное яблоко' и 'зеленое яблоко'. О значении круглых скобок в этом выражении см. далее.

Символы круглых скобок '(' и ')'. Эти символы позволяют получить из искомой строки дополнительную информацию. Обычно, если парсер регулярных выражений ищет в тексте информацию по заданному выражению и находит ее - он просто возвращает найденную строку. Однако, если он встречает внутри регулярного выражения круглые скобки, то он рассматривает содержимое этих скобок как еще одно регулярное выражение, по которому необходимо произвести поиск. Парсер рекурсивно вызывает сам себя для поиска по новому регулярному выражению и использует результаты поиска для дальнейшей обработки основного регулярного выражения. При этом, если поиск хотя бы по одному из внутренних регулярных выражений не увенчался успехом - поиск по всему регулярному выражению считается безуспешным.

Теперь пример, когда получение результатов внутренних регулярных выражений может быть полезным. Допустим, нам необходимо проверить, является ли строка семизначным телефонным номером с указанием кода города и получить из нее код города и номер телефона:

/\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/

Некоторые из примененных здесь метасимволов вам еще неизвестны и будут рассмотрены чуть позднее. Давайте рассотрим этот regexp подробнее.

Первая круглая скобка здесь теряет свое специальное значение и будет рассматриваться как обычный символ:

/ \( (\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/

Далее идет регулярное выражение в скобках (проверка кода города):

/\((\d{3,5}) \)\s+(\d{3}-\d{2}-\d{2})/

После этого идет закрывающая круглая скобка, которая также лишена своего специального значения из-за символа обратного слэша, стоящего перед ней:

/\((\d{3,5}) \) \s+(\d{3}-\d{2}-\d{2})/

Затем идет пропуск пустого места:

/\((\d{3,5})\) \s+ (\d{3}-\d{2}-\d{2})/

И еще одно регулярное выражение в скобках, которое проверяет номер телефона:

/\((\d{3,5})\)\s+ (\d{3}-\d{2}-\d{2}) /

Как видите, здесь есть 3 регулярных выражения - основное и два внутренних. При этом основное выражение позволяет нам проверить, имеет ли строка необходимый нам формат, а два внутренних - получить соответственно код города и номер телефона. Т.е. одним регулярным выражением мы можем решить сразу несколько задач!

Посмотрим, как работает это регулярное выражение. Пусть у нас есть строка: "My phone is (095) 123-45-67". Результатами поиска будут 3 строки: '(095) 123-45-67', '095' и '123-45-67'.

Нам осталось рассмотреть еще одну группу метасимволов, определяющих количественные показатели (т.н. quantifiers). Как вы уже могли заметить ранее - очень часто бывает необходимо указать, что какой-то символ должен повторяться определенное количество раз. Конечно, можно просто указать его необходимое количество раз непосредственно в строке, но это, естественно не выход. Тем более, что очень часто встречаются ситуации, когда точное количество символов неизвестно. Поэтому синтаксис регулярных выражений содержит набор метасимволов, предназначенных именно для решения подобных задач. Каждый из описанных ниже метасимволов определяет количественную характеристику символа который находится непосредственно перед ним.

Звездочка '*'. Указывает, что символ должен быть повторен 0 или более раз (т.е. символ может отсутствовать или присутствовать в любых количествах). Пример: выражение /ab*c/ найдет строки 'ac', 'abc', 'abbc' и т.д.

Плюс '+'. Указывает, что символ должен быть повторен 1 или более раз (т.е. символ обязан присутствовать и может присутствовать в любых количествах). Пример: выражение /ab+c/ найдет строки 'abc', 'abbc', 'abbbc' и т.д., но не найдет строку 'ac'.

Знак вопроса '?'. Указывает, что символ моет как присутствовать, так и нет, но при этом не может повторяться более одного раза. Пример: выражение /ab?c/ найдет строки 'ac' и 'abc', но не найдет строку 'abbc'.

Фигурные скобки '{' и '}'. Определяют количественную характеристику символа. Внутри скобок через запятую перечисляются минимальное и максимальное количество повторений символа. При этом любой из параметров может быть опущен, а кроме того можно задать точное количество повторений, указав только одно число. Примеры:

· {2,4} - символ долен повториться минимум 2 раза, но не более 4.

· {,5} - символ может отсутствовать (т.к. не задано минимальное количество повторений), но если присутствует, то не должен повторяться более 5 раз.

· {3,} - символ должен повторяться минимум 3 раза, но может быть и больше.

· {4} - символ должен повторяться ровно 4 раза

Есть еще одна тонкость в использовании метасимвола '? '. Посмотрите на такое выражение: /.+a/. Ожидается, что оно вернет нам часть текста до первого вхождения символа ' a ' в этот текст. На самом деле оно будет работать несколько не так, как ожидается и результатом поиска будет весь текст до последнего вхождения символа ' a '. Дело в том, что по умолчанию количественные метасимволы "жадничают" и пытаются захватить как можно больший кусок текста. Если это не нужно (как а нашем случае), то необходимо "отучить" их от жадности, указав знак '? ' после количественного метасимвола: /.+?a/. После этого выражение будет работать так как надо.

Как уже было сказано ранее - механизм регулярных выражений позволяет добавлять модификаторы, влияющие на обработку регулярного выражения. В табл. 3 рассмотрены наиболее употребительные модификаторы.

 

Таблица 3. Модификаторы

Модификатор Значение
i Включение режима case-insensitive, т.е. большие и маленькие буквы в выражении не различаются.
m Указывает на то, что текст, по которому ведется поиск, должен рассматриваться как состоящий из нескольких строк. По умолчанию механизм регулярных выражений рассматривает текст как одну строку вне зависимости от того, чем она является на самом деле. Соответственно метасимволы ' ^ ' и ' $ ' указывают на начало и конец всего текста. Если же этот модификатор указан, то они будут указывать соответственно на начало и конец каждой строки текста.
s По умолчанию метасимвол '. ' не включает в свое определение символ перевода строки. Т.е. для многострочного текста выражение /.+/ вернет только первую строку, а не весь текст, как ожидается. Указание этого модификатора снимает это ограничение.
U Делает все количественные метасимволы "не жадными" по умолчанию (про "жадность" количественных метасимволов см. выше)

 

На этом мы заканчиваем рассмотрение синтаксиса регулярных выражений, но тема еще не закончена. В следующем выпуске мы рассмотрим вопросы того, как PHP работает с регулярными выражениями, а также рассмотрим некоторые практические примеры использования регулярных выражений в ваших программах.

Функции, которые поддерживают регулярные выражения:

ereg() ereg_replace() eregi() eregi_replace() split()

ereg - парное значение регулярного выражения

int ereg(string pattern, string string, array [regs]);

Ищет в строке string шаблон, переданном в регулярном выражении, указанном в pattern. Если шаблон присутствует в строке, тогда возвращает значение, отличное от нуля. В третий параметр можно записывать части строки, соответствующие шаблону. Поиск чуствителен к регистру.

ereg_replace -- заменяет регулярное выражение

stringereg_replace(stringpattern, stringreplacement, stringstring);

Ищет по шаблону pattern в строке string и затем заменяет найденный текст на replacement. Возвращает либо измененную строку в случае удачи, либо исходную строку. Чувствителен к регистру.

eregiereg

interegi(stringpattern, stringstring, array [regs]);

eregi_replace - замена регулярного выражения без учета регистра

string eregi_replace(string pattern, string replacement, string string);

Эта функция идентична ereg_replace() за исключением того, что она игнорирует различие в регистре у букв.

Функция split - разбивает строку на массив

arraysplit(stringpattern, stringstring, int [limit]);

Возвращает массив строк, каждая из которых является подстрокой строки, образованные разбитием этой строки на части, отделенные друг от друга разделителем, определенном в параметре pattern. Третий параметр определяет количество элементов в массиве. Если произойдет ошибка, функция вернет false.

 

ВНИМАНИЕ: в php версии 4.0 и выше вместо описанных метасимволов используются следующие:

[[:alpha:]] Любая буква
[[:digit:]] Любая цифра
[[:alnumt:]] Любая букваили цифра
[[:space:]] Любой пробельный символ
[[:upper:]] Любая заглавная буква
[[:lower:]] Любая маленькая буква
[[:punct:]] Любой знак пунктуации
[[:xdigit:]] Любая шестнадцатиричная буква

 

 

11. Cookies

 

Cookies были разработаны для решения проблемы сохранения состояния между последовательными посещениями сервера клиентами. Cookies позволяют веб-серверам записывать некоторые данные на жесткий диск каждого клиента и затем, при последующих посещениях извлекать их.

Cookie - маленький текстовый файл, который содержит записи, сделанные сервером, и хранится у клиента в папке Cookies определенное время.

Существуют определенные ограничения, накладываемые на использование cookies. Во-первых, браузер не может иметь более 300 cookies и более 20 cookies на один сервер. Во-вторых, cookies посылаются только тем серверам, которым разрешено их получать.

В cookies задаются следующие параметры:

· Время хранения. По умолчанию cookies существуют до момента закрытия браузера.

· Информация о пути. Указывает каталоги на сервере, для которых действует cookie. По умолчанию указывает все каталоги сервера.

· Информация о домене. В cookie можно настроить имена доменов, для которых они будут посылаться. По умолчанию устанавливается домен сервера, установившего cookie.

· Параметр защиты. Сookies могут посылаться как по защищенным, так и по открытым каналам. По умолчанию - по открытому каналу, но если параметр защиты включен, будут отправляться по защищенным каналам (т.е. через протокол HTTPS).

 

Приведем пример использования Cookies на конкретном примере. Предположим, нам нужно написать счетчик посещения сайта каждым конкретным посетителем. Данную задачу можно решить двумя способами. Первый из них заключается в ведении учета IP-адресов пользователей. Для этого нужна база данных всего из одной таблицы, примерная структура которой такая:

IP-адрес Число посещений
110.117.234.203  
212.201.268.207  
83.103.203.73  

 

Когда пользователь заходит на сайт, нам нужно определить его IP-адрес, найти в базе данных информацию о его посещениях, увеличить счетчик и вывести его в браузер посетителя. Написать обработчик (скрипт) подобной процедуры несложно. Однако при использовании такого метода у нас появляются проблемы следующего характера:

· Для каждого IP-адреса нужно вести учет в одной таблице, которая может быть очень большой. А из этого следует, что мы нерационально используем процессорное время и дисковое пространство;

 

· У большинства домашних пользователей IP-адреса являются динамическими. То есть, сегодня у него адрес 212.218.78.124, а завтра - 212.218.78.137. Таким образом, велика вероятность идентифицировать одного пользователя несколько раз.

Можно использовать второй способ, который намного легче в реализации и более эффективен. Мы устанавливаем в Cookie переменную, которая будет храниться на диске удаленного пользователя. Эта переменная и будет хранить информацию о посещениях. Она будет считываться скриптом при обращении посетителя к серверу. Выгода такого метода идентификации очевидна. Во-первых, нам не нужно хранить множество ненужной информации о IP-адресах. Во-вторых, нас не интересуют динамические IP-адреса, поскольку данные о своих посещениях хранятся конкретно у каждого посетителя сайта.

 

Чтобы установить cookie используется функция setcookie.

int setcookie (string name, string [value], int [expire], string [path], string [domain], int [secure]),

где первый параметр - имя cookie. value - значение, соответствующее этому cookie. Третий параметр - время жизни cookie (устанавливается при помощи функций time() либо mktime()). Четвертый параметр - информация о пути. domain - имя домена, и secure - параметр защиты (если установлен в 1, cookie посылается по защищенному каналу).

Необходимо помнить, что функция setcookie должна находиться в самом начале страницы, так как любое содержание, предшествующее тегу РНР, приводит к возникновению ошибки при работе с cookies.

 

Пример 26.Cookies

<?php $cook++; setcookie("cook", $cook, mktime(18,0,0,10,31,2002)); //истекает 31 ноября 2002 года в 18:00:00 echo "Hello! You were here ".$cook;?>

Приведенный выше пример определяет сколько раз пользователь посещал данный сайт. Важно помнить, что cookie и соответствующая переменная (в нашем случае "cook" и $cook) доступны только в том случае, если клиент принимает и возвращает cookie обратно серверу.

Доступ к cookie происходит через глобальную переменную с таким же именем, как и у cookie. Но это не единственный способ доступа к cookie. Второй способ - это доступ через глобальный массив $HTTP_COOKIE_VARS, который хранит только переменные, связанные с cookies.

echo $HTTP_COOKIE_VARS["cook"];

Кроме всего прочего, у Вас есть еще возможность в одном cookie сохранить несколько значений. Для этого cookie рассматривается как массив, и всем элементам этого массива присваиваются значения.

 

Пример 27.Cookies в виде массива

$name = "Vasya";if(!isset($ArrCook[0])){ setcookie("ArrCook[0]", $name);}if(!isset($ArrCook[1])){ $ArrCook[1] = 0;}$ArrCook[1]++;setcookie("ArrCook[1]", $ArrCook[1]); echo "Hello, ".$ArrCook[0]." you were here ".$ArrCook[1]." times!";

 

 

12. Сессии

 

Сессии и cookies предназначены для хранения сведений о пользователях при переходах между несколькими страницами. При использовании сессий данные сохраняются во временных файлах на сервере. Файлы с cookies хранятся на компьютере пользователя, и по запросу отсылаются браузером серверу.

Использование сессий и cookies очень удобно и оправдано в таких приложениях как Интернет-магазины, форумы, доски объявлений, когда, во-первых, необходимо сохранять информацию о пользователях на протяжении нескольких станиц, а, во-вторых, своевременно предоставлять пользователю новую информацию.

Протокол HTTP является протоколом "без сохранения состояния". Это означает, что данный протокол не имеет встроенного способа сохранения состояния между двумя транзакциями. Т. е., когда пользователь открывает сначала одну страницу сайта, а затем переходит на другую страницу этого же сайта, то основываясь только на средствах, предоставляемых протоколом HTTP невозможно установить, что оба запроса относятся к одному пользователю. Т. о. необходим метод, при помощи которого было бы отслеживать информацию о пользователе в течение одного сеанса связи с Web-сайтов. Одним из таких методов является управление сеансами при помощи предназначенных для этого функций. Для нас важно то, что сеанс по сути, представляет собой группу переменных, которые, в отличие от обычных переменных, сохраняются и после завершения выполнения PHP-сценария.

При работе с сессиями различают следующие этапы:

· открытие сессии

· регистрация переменных сессии и их использование

· закрытие сессии

 

Самый простой способ открытия сессии заключается в использовании функции session_start(), которая вызывается в начале PHP-сценария.Эта функция проверяет, существует ли идентификатор сессии, и, если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.После инициализации сессии появляется возможность сохранять информацию в суперглобальном массиве $_SESSION.

Пример28. Организация сессии (сеанса)

Пусть имеется файл index.php в котором в массив $_SESSION сохраняется переменная и массив.

 

index.php <?php// Инициируем сессию session_start();// Помещаем значение в сессию $_SESSION['name'] = "value"; // Помещаем массив в сессию$arr = array("first", "second", "third");$_SESSION['arr'] = $arr; // Выводим ссылку на другую страницуecho "<a href='other.php'>другая страница</a>";?>

На страницах, где происходит вызов функции session_start(), значения данных переменных можно извлечь из суперглобального массива $_SESSION. В следующем листинге приводится содержимое страницы other.php, где извлекаются данные, ранее помещенные на странице index.php.

other.php <?php // Инициируем сессию session_start(); // Выводим содержимое суперглобального массива $_SESSION echo "<pre>"; print_r($_SESSION); echo "</pre>";?>

После завершения работы с сессией сначала нужно разрегистрировать все переменные сессии, а затем вызвать функцию unset($_SESSION["username"]).

Date: 2015-07-22; view: 634; Нарушение авторских прав; Помощь в написании работы --> СЮДА...



mydocx.ru - 2015-2024 year. (0.005 sec.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав - Пожаловаться на публикацию