Привет, Хаброжители! Сложно найти что-то толковое про PHP? Проверенная временем, обновленная в четвертом издании, эта книга помогает начинающим разработчикам научиться всему, что необходимо для создания качественных веб-приложений.
Вы начнете с общего описания технологии и постепенно перейдете к синтаксису языка, приемам программирования и другим важным деталям. При этом будут использоваться примеры, демонстрирующие и правильное применение языка, и распространенные идиомы. Предполагается, что читатель уже имеет опыт работы с HTML.
Вы получите множество рекомендаций по стилю программирования и процессу разработки ПО от Кевина Татро и Питера Макинтайра. Этот материал, изложенный в доступной и компактной форме, поможет вам овладеть мастерством программирования на PHP. • Общие сведения о том, какой результат можно получить, используя PHP. • Основы языка, включая типы данных, переменные, операторы, управляющие команды. • Функции, строки, массивы и объекты. • Решение распространенных задач разработки: обработка форм, проверка данных, отслеживание сеансовых данных и cookie. • Работа с реляционными базами данных (MySQL) и базами данных NoSQL (например MongoDB). • Генерирование изображений, создание файлов PDF, парсинг файлов XML. • Безопасность скриптов, обработка ошибок, оптимизация быстродействия и другие нетривиальные темы.
Если вам понадобится более сложная функциональность поиска, которую не обеспечивают перечисленные методы, можно воспользоваться регулярным выражением — строкой, представляющей паттерн. Функции, использующие регулярные выражения, сравнивают строку с заданным паттерном. Одни функции сообщают, было ли найдено совпадение, а другие вносят изменения в строку.
В PHP регулярные выражения применяются: для поиска совпадений (и извлечения информации из строк), для замены текста в соответствии с паттерном и для разбиения строк на массив меньших фрагментов. Функция preg_match() выполняет поиск регулярного выражения.
Perl давно считается эталонным языком для работы с регулярными выражениями. В PHP используется библиотека C pcre, обеспечивающая почти полную поддержку возможностей регулярных выражений Perl, которые работают с произвольными двоичными данными и позволяют безопасно выполнять поиск по паттернам или в строках, содержащих нулевой байт (\x00).
Большинство символов в регулярных выражениях являются литеральными, что отражается на поиске совпадений. Например, если вы ищете совпадение для регулярного выражения "/cow/" в строке «Dave was a cowhand», то совпадение будет найдено, потому что последовательность символов «cow» встречается в этой строке.
Некоторые символы имеют специальный смысл в регулярных выражениях. Например, символ ^ в начале регулярного выражения означает, что совпадение должно начинаться от начала строки (а точнее, обозначает привязку регулярного выражения к началу строки).
Аналогичным образом символ $ в конце регулярного выражения означает, что совпадение должно завершаться в конце строки (то есть обозначает привязку регулярного выражения к концу строки).
Точка в регулярном выражении обозначает один любой символ:
Чтобы обозначить совпадение для одного из этих специальных символов (метасимволов), экранируйте его с помощью обратного слеша:
Регулярные выражения по умолчанию учитывают регистр символов, поэтому регулярное выражение "/cow/" не совпадет со строкой «COW». Чтобы выполнить поиск совпадения символов без учета регистра, установите соответствующий флаг (показан далее в этой главе).
До сих пор мы не сделали ничего, что нельзя было бы сделать обычными строковыми функциями. Настоящая мощь регулярных выражений проявляется в возможности поиска совпадения разных последовательностей символов с абстрактными паттернами трех типов, к которым относятся:
Эти три разновидности паттернов можно объединять бесчисленными способами и создавать регулярные выражения для таких конструкций, как телефонные номера и URL-адреса.
Символьные классы
Чтобы задать набор допустимых символов в паттерне, либо постройте символьный класс самостоятельно, либо примените готовый класс. Чтобы построить собственный класс, заключите допустимые символы в квадратные скобки:
Движок регулярных выражений находит в строке символ «c», после чего проверяет, является ли следующий символ гласной буквой («a», «e», «i», «o» или «u»). Если нет, то движок переходит к поиску следующего символа «c». Если да, движок проверяет, является ли следующий символ буквой «t». Если совпадение обнаружено, движок возвращает true или, в противном случае, возобновляет поиск следующего символа «c».
Символьный класс можно инвертировать, поставив символ ^ в начало перечисления символов:
В этом случае движок регулярных выражений ищет символ «c», за которым следует символ, не являющийся гласной буквой, после чего идет буква «t».
Символ — (дефис) в символьных классах используется для определения диапазонов символов. Он упрощает определение таких символьных классов, как «все буквы» и «все цифры»:
Когда вы задаете символьный класс, некоторые специальные символы теряют свой смысл, тогда как другие, наоборот, приобретают новые роли. Так, якорный символ $ и точка теряют свои роли в символьных классах, тогда как символ ^ уже не обозначает привязку к началу строки, а инвертирует символьный класс, если является первым символом после открывающей квадратной скобки. Например, [^\]] совпадает с любым символом, кроме закрывающей квадратной скобки, тогда как [$.^] совпадает с любым из трех знаков (доллар, точка или крышка).
Различные библиотеки регулярных выражений определяют сокращения для символьных классов, включая цифры, алфавитные символы и пробелы.
Альтернативы
Символ | (вертикальная черта) используется для определения альтернатив в регулярных выражениях:
Приоритет применения альтернатив может показаться странным: так, "/^cat|dog$/" выбирает один из двух вариантов — "^cat" и «dog$». Это означает, что совпадение будет найдено в строке, которая либо начинается с «cat», либо завершается «dog». Если вам нужна строка, содержащая только «cat» или «dog», используйте регулярное выражение "/^(cat|dog)$/".
Символьные классы и альтернативы могут применяться, например, для проверки строк, которые не должны начинаться с буквы в верхнем регистре:
Повторяющиеся последовательности
Для определения паттернов с повторениями используются квантификаторы. Квантификатор определяет, сколько раз выбранный фрагмент должен повториться. В табл. 4.6 перечислены квантификаторы, поддерживаемые регулярными выражениями PHP.
Чтобы искать повторы отдельного символа, просто поставьте квантификатор за символом:
С квантификаторами и символьными классами можно решать такие задачи, как проверка на действительность телефонных номеров США:
Подпаттерны
Части регулярных выражений можно группировать в круглых скобках, чтобы они рассматривались как единое целое, то есть подпаттерн:
Круглые скобки также обеспечивают сохранение (захват) совпадения для подпаттерна. Если передать функции поиска совпадения в третьем аргументе массив, этот массив будет заполнен подстроками совпадений:
Нулевому элементу массива присваивается вся строка, в которой ведется поиск совпадений. В первом элементе хранится подстрока, совпавшая с первым подпаттерном (если совпадение обнаружено), во втором — подстрока, совпавшая со вторым подпаттерном, и т. д.
Ограничители
Регулярные выражения в Perl эмулируют действия паттернов Perl, заимствуя из их синтаксиса ограничители. Чаще всего ограничителями выступают слеши (например, /паттерн/), реже — любой неалфавитно-цифровой символ, кроме обратного слеша. В частности, это удобно при поиске совпадений для строк, содержащих слеши. Например, следующие вызовы эквивалентны:
Скобки — круглые (), фигурные {}, квадратные [] и угловые <> — тоже могут использоваться в качестве ограничителей паттернов:
В разделе «Флаги-модификаторы» рассматриваются односимвольные модификаторы, которые можно разместить после закрывающего ограничителя для изменения поведения движка регулярных выражений. Очень полезен флаг x, который заставляет движок отсекать пробелы и комментарии, отмеченные #, из регулярных выражений перед поиском совпадения.
Следующие два паттерна эквивалентны, но второй читается намного проще:
Поведение при поиске совпадения
Точка. совпадает с любым символом, кроме символа новой строки (\n). Знак $ совпадает с концом строки или, если строка завершается символом новой строки, с позицией, непосредственно предшествующей этому символу:
Символьные классы
Как видно из табл. 4.7, Perl-совместимые регулярные выражения определяют несколько именованных наборов символов, которые можно использовать в символьных классах. В табл. 4.7 приведены расширения только для английского языка, но фактически буквы можно взять из других локальных контекстов.
Каждый класс [: что-то :] может использоваться вместо символа в символьном классе. Например, для нахождения любого символа, который является цифрой, буквой верхнего регистра или символом @, используйте следующее регулярное выражение:
[@[:digit:][:upper:]]
Однако символьный класс не может использоваться как конечная точка диапазона:
preg_match("/[A-[:lower:]]/", «string»);// недопустимое регулярное выражение
Символьная последовательность, которая в локальном контексте рассматривается как один символ, называется сверткой. Чтобы найти совпадение для одной из многосимвольных последовательностей в символьном классе, заключите ее в маркеры [. и .]. Например, если в локальном контексте присутствует свертка ch, следующий символьный класс будет совпадать с s, t или ch:
[st[.ch.]]
Последнее расширение символьных классов — класс эквивалентности, для определения которого символы заключаются в [= и =]. Классы эквивалентности совпадают с символами, имеющими одинаковый приоритет упорядочения по правилам локального контекста. Например, локальный контекст может определять, что символы a, á и ä имеют одинаковый приоритет упорядочения при сортировке. Чтобы найти совпадение для любого из них, используйте класс эквивалентности [=a=].
Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — PHP
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Вы начнете с общего описания технологии и постепенно перейдете к синтаксису языка, приемам программирования и другим важным деталям. При этом будут использоваться примеры, демонстрирующие и правильное применение языка, и распространенные идиомы. Предполагается, что читатель уже имеет опыт работы с HTML.
Вы получите множество рекомендаций по стилю программирования и процессу разработки ПО от Кевина Татро и Питера Макинтайра. Этот материал, изложенный в доступной и компактной форме, поможет вам овладеть мастерством программирования на PHP. • Общие сведения о том, какой результат можно получить, используя PHP. • Основы языка, включая типы данных, переменные, операторы, управляющие команды. • Функции, строки, массивы и объекты. • Решение распространенных задач разработки: обработка форм, проверка данных, отслеживание сеансовых данных и cookie. • Работа с реляционными базами данных (MySQL) и базами данных NoSQL (например MongoDB). • Генерирование изображений, создание файлов PDF, парсинг файлов XML. • Безопасность скриптов, обработка ошибок, оптимизация быстродействия и другие нетривиальные темы.
Для кого написана эта книга
PHP — это «плавильный котел» для смешения направлений программирования. Веб-дизайнеры ценят его за доступность и удобство, а программистам нравится его гибкость, мощность, разнообразие и скорость. Обоим направлениям необходим понятный и точный справочник по языку. Если вы (веб-)программист, то эта книга написана для вас. Мы представим общую картину языка PHP, а затем изложим подробности, не отнимая у вас лишнего времени. Многочисленные примеры, практические рекомендации по программированию и советы по стилю помогут вам стать не просто программистом PHP, а хорошим программистом PHP.
Веб-дизайнеры оценят доступные и практичные рекомендации по использованию конкретных технологий: JSON, XML, сеансовых данных, генерирования PDF, работы с графикой и т. д. Описание PHP и базовые концепции программирования изложены в книге доступным языком.
Веб-дизайнеры оценят доступные и практичные рекомендации по использованию конкретных технологий: JSON, XML, сеансовых данных, генерирования PDF, работы с графикой и т. д. Описание PHP и базовые концепции программирования изложены в книге доступным языком.
Регулярные выражения
Если вам понадобится более сложная функциональность поиска, которую не обеспечивают перечисленные методы, можно воспользоваться регулярным выражением — строкой, представляющей паттерн. Функции, использующие регулярные выражения, сравнивают строку с заданным паттерном. Одни функции сообщают, было ли найдено совпадение, а другие вносят изменения в строку.
В PHP регулярные выражения применяются: для поиска совпадений (и извлечения информации из строк), для замены текста в соответствии с паттерном и для разбиения строк на массив меньших фрагментов. Функция preg_match() выполняет поиск регулярного выражения.
Perl давно считается эталонным языком для работы с регулярными выражениями. В PHP используется библиотека C pcre, обеспечивающая почти полную поддержку возможностей регулярных выражений Perl, которые работают с произвольными двоичными данными и позволяют безопасно выполнять поиск по паттернам или в строках, содержащих нулевой байт (\x00).
Большинство символов в регулярных выражениях являются литеральными, что отражается на поиске совпадений. Например, если вы ищете совпадение для регулярного выражения "/cow/" в строке «Dave was a cowhand», то совпадение будет найдено, потому что последовательность символов «cow» встречается в этой строке.
Некоторые символы имеют специальный смысл в регулярных выражениях. Например, символ ^ в начале регулярного выражения означает, что совпадение должно начинаться от начала строки (а точнее, обозначает привязку регулярного выражения к началу строки).
preg_match("/^cow/", "Dave was a cowhand"); // возвращает false
preg_match("/^cow/", "cowabunga!"); // возвращает true
Аналогичным образом символ $ в конце регулярного выражения означает, что совпадение должно завершаться в конце строки (то есть обозначает привязку регулярного выражения к концу строки).
preg_match("/cow$/", "Dave was a cowhand"); // возвращает false
preg_match("/cow$/", "Don't have a cow"); // возвращает true
Точка в регулярном выражении обозначает один любой символ:
preg_match("/c.t/", "cat"); // возвращает true
preg_match("/c.t/", "cut"); // возвращает true
preg_match("/c.t/", "c t"); // возвращает true
preg_match("/c.t/", "bat"); // возвращает false
preg_match("/c.t/", "ct"); // возвращает false
Чтобы обозначить совпадение для одного из этих специальных символов (метасимволов), экранируйте его с помощью обратного слеша:
preg_match("/\$5.00/", "Your bill is $5.00 exactly"); // возвращает true
preg_match("/$5.00/", "Your bill is $5.00 exactly"); // возвращает false
Регулярные выражения по умолчанию учитывают регистр символов, поэтому регулярное выражение "/cow/" не совпадет со строкой «COW». Чтобы выполнить поиск совпадения символов без учета регистра, установите соответствующий флаг (показан далее в этой главе).
До сих пор мы не сделали ничего, что нельзя было бы сделать обычными строковыми функциями. Настоящая мощь регулярных выражений проявляется в возможности поиска совпадения разных последовательностей символов с абстрактными паттернами трех типов, к которым относятся:
- Набор допустимых символов, которые могут присутствовать в строке (например, алфавитные символы, цифры, конкретные знаки препинания).
- Набор альтернатив для строки (например, «com», «edu», «net» или «org»).
- Повторяющиеся последовательности в строке (например, как минимум одна, но не более пяти цифр).
Эти три разновидности паттернов можно объединять бесчисленными способами и создавать регулярные выражения для таких конструкций, как телефонные номера и URL-адреса.
Символьные классы
Чтобы задать набор допустимых символов в паттерне, либо постройте символьный класс самостоятельно, либо примените готовый класс. Чтобы построить собственный класс, заключите допустимые символы в квадратные скобки:
preg_match("/c[aeiou]t/", "I cut my hand"); // возвращает true
preg_match("/c[aeiou]t/", "This crusty cat"); // возвращает true
preg_match("/c[aeiou]t/", "What cart?"); // возвращает false
preg_match("/c[aeiou]t/", "14ct gold"); // возвращает false
Движок регулярных выражений находит в строке символ «c», после чего проверяет, является ли следующий символ гласной буквой («a», «e», «i», «o» или «u»). Если нет, то движок переходит к поиску следующего символа «c». Если да, движок проверяет, является ли следующий символ буквой «t». Если совпадение обнаружено, движок возвращает true или, в противном случае, возобновляет поиск следующего символа «c».
Символьный класс можно инвертировать, поставив символ ^ в начало перечисления символов:
preg_match("/c[^aeiou]t/", "I cut my hand"); // возвращает false
preg_match("/c[^aeiou]t/", "Reboot chthon"); // возвращает true
preg_match("/c[^aeiou]t/", "14ct gold"); // возвращает false
В этом случае движок регулярных выражений ищет символ «c», за которым следует символ, не являющийся гласной буквой, после чего идет буква «t».
Символ — (дефис) в символьных классах используется для определения диапазонов символов. Он упрощает определение таких символьных классов, как «все буквы» и «все цифры»:
preg_match("/[0-9]%/", "we are 25% complete"); // возвращает true
preg_match("/[0123456789]%/", "we are 25% complete"); // возвращает true
preg_match("/[a-z]t/", "11th"); // возвращает false
preg_match("/[a-z]t/", "cat"); // возвращает true
preg_match("/[a-z]t/", "PIT"); // возвращает false
preg_match("/[a-zA-Z]!/", "11!"); // возвращает false
preg_match("/[a-zA-Z]!/", "stop!"); // возвращает true
Когда вы задаете символьный класс, некоторые специальные символы теряют свой смысл, тогда как другие, наоборот, приобретают новые роли. Так, якорный символ $ и точка теряют свои роли в символьных классах, тогда как символ ^ уже не обозначает привязку к началу строки, а инвертирует символьный класс, если является первым символом после открывающей квадратной скобки. Например, [^\]] совпадает с любым символом, кроме закрывающей квадратной скобки, тогда как [$.^] совпадает с любым из трех знаков (доллар, точка или крышка).
Различные библиотеки регулярных выражений определяют сокращения для символьных классов, включая цифры, алфавитные символы и пробелы.
Альтернативы
Символ | (вертикальная черта) используется для определения альтернатив в регулярных выражениях:
preg_match("/cat|dog/", "the cat rubbed my legs"); // возвращает true
preg_match("/cat|dog/", "the dog rubbed my legs"); // возвращает true
preg_match("/cat|dog/", "the rabbit rubbed my legs"); // возвращает false
Приоритет применения альтернатив может показаться странным: так, "/^cat|dog$/" выбирает один из двух вариантов — "^cat" и «dog$». Это означает, что совпадение будет найдено в строке, которая либо начинается с «cat», либо завершается «dog». Если вам нужна строка, содержащая только «cat» или «dog», используйте регулярное выражение "/^(cat|dog)$/".
Символьные классы и альтернативы могут применяться, например, для проверки строк, которые не должны начинаться с буквы в верхнем регистре:
preg_match("/^([a-z]|[0-9])/", "The quick brown fox"); // возвращает false
preg_match("/^([a-z]|[0-9])/", "jumped over"); // возвращает true
preg_match("/^([a-z]|[0-9])/", "10 lazy dogs"); // возвращает true
Повторяющиеся последовательности
Для определения паттернов с повторениями используются квантификаторы. Квантификатор определяет, сколько раз выбранный фрагмент должен повториться. В табл. 4.6 перечислены квантификаторы, поддерживаемые регулярными выражениями PHP.
Чтобы искать повторы отдельного символа, просто поставьте квантификатор за символом:
preg_match("/ca+t/", "caaaaaaat"); // возвращает true
preg_match("/ca+t/", "ct"); // возвращает false
preg_match("/ca?t/", "caaaaaaat"); // возвращает false
preg_match("/ca*t/", "ct"); // возвращает true
С квантификаторами и символьными классами можно решать такие задачи, как проверка на действительность телефонных номеров США:
preg_match("/[0-9]{3}-[0-9]{3}-[0-9]{4}/", "303-555-1212"); // возвращает true
preg_match("/[0-9]{3}-[0-9]{3}-[0-9]{4}/", "64-9-555-1234"); // возвращает false
Подпаттерны
Части регулярных выражений можно группировать в круглых скобках, чтобы они рассматривались как единое целое, то есть подпаттерн:
preg_match("/a (very )+big dog/", "it was a very very big dog"); // возвращает
true
preg_match("/^(cat|dog)$/", "cat"); // возвращает true
preg_match("/^(cat|dog)$/", "dog"); // возвращает true
Круглые скобки также обеспечивают сохранение (захват) совпадения для подпаттерна. Если передать функции поиска совпадения в третьем аргументе массив, этот массив будет заполнен подстроками совпадений:
preg_match("/([0-9]+)/", "You have 42 magic beans", $captured);
// возвращает true и заполняет $captured
Нулевому элементу массива присваивается вся строка, в которой ведется поиск совпадений. В первом элементе хранится подстрока, совпавшая с первым подпаттерном (если совпадение обнаружено), во втором — подстрока, совпавшая со вторым подпаттерном, и т. д.
Ограничители
Регулярные выражения в Perl эмулируют действия паттернов Perl, заимствуя из их синтаксиса ограничители. Чаще всего ограничителями выступают слеши (например, /паттерн/), реже — любой неалфавитно-цифровой символ, кроме обратного слеша. В частности, это удобно при поиске совпадений для строк, содержащих слеши. Например, следующие вызовы эквивалентны:
preg_match("/\/usr\/local\//", "/usr/local/bin/perl"); // возвращает true
preg_match("#/usr/local/#", "/usr/local/bin/perl"); // возвращает true
Скобки — круглые (), фигурные {}, квадратные [] и угловые <> — тоже могут использоваться в качестве ограничителей паттернов:
preg_match("{/usr/local/}", "/usr/local/bin/perl"); // возвращает true
В разделе «Флаги-модификаторы» рассматриваются односимвольные модификаторы, которые можно разместить после закрывающего ограничителя для изменения поведения движка регулярных выражений. Очень полезен флаг x, который заставляет движок отсекать пробелы и комментарии, отмеченные #, из регулярных выражений перед поиском совпадения.
Следующие два паттерна эквивалентны, но второй читается намного проще:
'/([[:alpha:]]+)\s+\1/'
'/( # начать сохранение
[[:alpha:]]+ # слово
\s+ # пробел
\1 # снова то же слово
) # завершить сохранение
/x'
Поведение при поиске совпадения
Точка. совпадает с любым символом, кроме символа новой строки (\n). Знак $ совпадает с концом строки или, если строка завершается символом новой строки, с позицией, непосредственно предшествующей этому символу:
preg_match("/is (.*)$/", "the key is in my pants", $captured);
// $captured[1] содержит 'in my pants'
Символьные классы
Как видно из табл. 4.7, Perl-совместимые регулярные выражения определяют несколько именованных наборов символов, которые можно использовать в символьных классах. В табл. 4.7 приведены расширения только для английского языка, но фактически буквы можно взять из других локальных контекстов.
Каждый класс [: что-то :] может использоваться вместо символа в символьном классе. Например, для нахождения любого символа, который является цифрой, буквой верхнего регистра или символом @, используйте следующее регулярное выражение:
[@[:digit:][:upper:]]
Однако символьный класс не может использоваться как конечная точка диапазона:
preg_match("/[A-[:lower:]]/", «string»);// недопустимое регулярное выражение
Символьная последовательность, которая в локальном контексте рассматривается как один символ, называется сверткой. Чтобы найти совпадение для одной из многосимвольных последовательностей в символьном классе, заключите ее в маркеры [. и .]. Например, если в локальном контексте присутствует свертка ch, следующий символьный класс будет совпадать с s, t или ch:
[st[.ch.]]
Последнее расширение символьных классов — класс эквивалентности, для определения которого символы заключаются в [= и =]. Классы эквивалентности совпадают с символами, имеющими одинаковый приоритет упорядочения по правилам локального контекста. Например, локальный контекст может определять, что символы a, á и ä имеют одинаковый приоритет упорядочения при сортировке. Чтобы найти совпадение для любого из них, используйте класс эквивалентности [=a=].
Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — PHP
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.