Обработка строк в рнр


Содержание

ГЛАВА 8 Строки и регулярные выражения в PHP

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

Поиск по шаблону позволяет не только находить определенные фрагменты текста, но и заменять их другими фрагментами. Одним из стандартных примеров поиска по шаблону являются команды поиска/замены в текстовых редакторах — например, в MS Word, Emacs и в моем любимом редакторе vi. Всем пользователям UNIX хорошо известны такие программы, как sed, awk и grep; богатство возможностей этих программ в значительной степени обусловлено средствами поиска по шаблону. Механизмы поиска по шаблону решают четыре основные задачи:

  • поиск строк, в точности совпадающих с заданным шаблоном;
  • поиск фрагментов строк, совпадающих с заданным шаблоном;
  • замену строк и подстрок по шаблону;
  • поиск строк, с которыми заданный шаблон не совпадает.

Появление Web породило необходимость в более быстрых и эффективных средствах поиска данных, которые бы позволяли пользователям со всего мира находить нужную информацию среди миллиардов web-страниц. Поисковые системы, онлайновые финансовые службы и сайты электронной коммерции — все это стало бы абсолютно бесполезным без средств анализа гигантских объемов данных в этих секторах. Действительно, средства обработки строковой информации являются жизненно важной составляющей практически любого сектора, так или иначе связанного с современными информационными технологиями. В этой главе основное внимание посвящено средствам обработки строк в PHP. Мы рассмотрим некоторые стандартные строковые функции (в языке их больше 60!), а из приведенных определений и примеров вы получите сведения, необходимые для создания web-приложений. Но прежде чем переходить к специфике PHP, я хочу познакомить вас с базовым механизмом, благодаря которому становится возможным поиск по шаблону. Речь идет о регулярных выражениях.

Регулярные выражения

Регулярные выражения лежат в основе всех современных технологий поиска по шаблону. Регулярное выражение представляет собой последовательность простых и служебных символов, описывающих искомый текст. Иногда регулярные выражения бывают простыми и понятными (например, слово dog), но часто в них присутствуют служебные символы, обладающие особым смыслом в синтаксисе регулярных выражений, — например, .* .

В PHP существуют два семейства функций, каждое из которых относится к определенному типу регулярных выражений: в стиле POSIX или в стиле Perl. Каждый тип регулярных выражений обладает собственным синтаксисом и рассматривается в соответствующей части главы. На эту тему были написаны многочисленные учебники, которые можно найти как в Web, так и в книжных магазинах. Поэтому я приведу лишь основные сведения о каждом типе, а дальнейшую информацию при желании вы сможете найти самостоятельно. Если вы еще не знакомы с принципами работы регулярных выражений, обязательно прочитайте краткий вводный курс, занимающий всю оставшуюся часть этого раздела. А если вы хорошо разбираетесь в этой области, смело переходите к следующему разделу.

Синтаксис регулярных выражений (POSIX)

Структура регулярных выражений POSIX чем-то напоминает структуру типичных математических выражений — различные элементы (операторы) объединяются друг с другом и образуют более сложные выражения. Однако именно смысл объединения элементов делает регулярные выражения таким мощным и выразительным средством. Возможности не ограничиваются поиском литерального текста (например, конкретного слова или числа); вы можете провести поиск строк с разной семантикой, но похожим синтаксисом — например, всех тегов HTML в файле.

Простейшее регулярное выражение совпадает с одним литеральным символом — например, выражение g совпадает в таких строках, как g , haggle и bag. Выражение, полученное при объединении нескольких литеральных символов, совпадает по тем же правилам — например, последовательность gan совпадает в любой строке, содержащей эти символы (например, gang, organize или Reagan).

Оператор | (вертикальная черта) проверяет совпадение одной из нескольких альтернатив. Например, регулярное выражение php | zend проверяет строку на наличие php или zend.

Квадратные скобки ([ ]) имеют особый смысл в контексте регулярных выражений — они означают «любой символ из перечисленных в скобках». В отличие от регулярного выражения php, которое совпадает во всех строках, содержащих литеральный текст php, выражение [php] совпадает в любой строке, содержащей символы р или h. Квадратные скобки играют важную роль при работе с регулярными выражениями, поскольку в процессе поиска часто возникает задача поиска символов из заданного интервала. Ниже перечислены некоторые часто используемые интервалы:

  • [0-9] — совпадает с любой десятичной цифрой от 0 до 9;
  • [a-z] — совпадает с любым символом нижнего регистра от а до z;
  • [A-Z] — совпадает с любым символом верхнего регистра от А до Z;
  • [a -Z] — совпадает с любым символом нижнего или верхнего регистра от а до Z.

Конечно, перечисленные выше интервалы всего лишь демонстрируют общий принцип. Например, вы можете воспользоваться интервалом [0-3] для обозначения любой десятичной цифры от 0 до 3 или интервалом [b-v] для обозначения любого символа нижнего регистра от b до v. Короче говоря, интервалы определяются совершенно произвольно.

Существует особый класс служебных символов, обозначающих количество повторений отдельного символа или конструкции, заключенной в квадратные скобки. Эти служебные символы (+, * и <. >) называются квантификаторами. Принцип их действия проще всего пояснить на примерах:

  • р+ означает один или несколько символов р, стоящих подряд;
  • р* означает ноль и более символов р, стоящих подряд;
  • р? означает ноль или один символ р;
  • р <2>означает два символа р, стоящих подряд;
  • р <2,3>означает от двух до трех символов р, стоящих подряд;
  • р <2,>означает два и более символов р, стоящих подряд.

Прочие служебные символы

Служебные символы $ и ^ совпадают не с символами, а с определенными позициями в строке. Например, выражение р$ означает строку, которая завершается символом р, а выражение ^р — строку, начинающуюся с символа р.

  • Конструкция [^a-zA-Z] совпадает с любым символом, не входящим в указаные интервалы (a-z и A-Z).
  • Служебный символ . (точка) означает «любой символ». Например, выражение р.р совпадает с символом р, за которым следует произвольный символ, после чего опять следует символ р.

Объединение служебных символов приводит к появлению более сложных выражений. Рассмотрим несколько примеров:

  • ^.<2>$ — любая строка, содержащая ровно два символа;
  • (.*) — произвольная последовательность символов, заключенная между и (вероятно, тегами HTML для вывода жирного текста);
  • p(hp)* — символ р, за которым следует ноль и более экземпляров последовательности hp (например, phphphp).

Иногда требуется найти служебные символы в строках вместо того, чтобы использовать их в описанном специальном контексте. Для этого служебные символы экранируются обратной косой чертой (\). Например, для поиска денежной суммы в долларах можно воспользоваться выражением \$[0-9]+, то есть «знак доллара, за которым следует одна или несколько десятичных цифр». Обратите внимание на обратную косую черту перед $. Возможными совпадениями для этого регулярного выражения являются $42, $560 и $3.

Стандартные интервальные выражения (символьные классы)

Для удобства программирования в стандарте POSIX были определены некоторые стандартные интервальные выражения, также называемые символьными классами (character classes). Символьный класс определяет один символ из заданного интервала — например, букву алфавита или цифру:

  • [[:alpha:]] — алфавитный символ (aA-zZ);
  • [[:digit:]]-цифра (0-9);
  • [[:alnum:]] — алфавитный символ (aA-zZ) или цифра (0-9);
  • [[:space:]] — пропуски (символы новой строки, табуляции и т. д.).

Функции PHP для работы с регулярными выражениями (POSIX-совместимые)

В настоящее время PHP поддерживает семь функций поиска с использованием регулярных выражений в стиле POSIX:

Описания этих функций приведены в следующих разделах.

Функция еrеg( ) ищет в заданной строке совпадение для шаблона. Если совпадение найдено, возвращается TRUE, в противном случае возвращается FALSE. Синтаксис функции ereg( ):

int ereg (string шаблон, string строка [, array совпадения])

Поиск производится с учетом регистра алфавитных символов. Пример использования ereg( ) для поиска в строках доменов .соm:

$is_com — ereg(«(\.)(com$)», $email):

// Функция возвращает TRUE, если $email завершается символами «.com»

// В частности, поиск будет успешным для строк

// «www.wjgilmore.com» и «someemail@apress.com»

Обратите внимание: из-за присутствия служебного символа $ регулярное выражение совпадает только в том случае, если строка завершается символами .com. Например, оно совпадет в строке «www.apress.com», но не совпадет в строке «www.apress.com/catalog».

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

Листинг 8.1. Вывод элементов массива $regs

// Разделить $url на три компонента: «http://www». «apress» и «com»

if ($www_url) : // Если переменная $www_url содержит URL

echo $regs[0]; // Вся строка «http://www.apress.com»

echo $regs[l]; // «http://www»

echo $regs[2]; // «apress»

echo $regs[3]; // «com» endif;

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

http://www.apress.com http://www apress com

Функция ereg_replace( ) ищет в заданной строке совпадение для шаблона и заменяет его новым фрагментом. Синтаксис функции ereg_replace( ):

string ereg_replace (string шаблон, string замена, string строке)

Функция ereg_replace( ) работает по тому же принципу, что и ereg( ), но ее возможности расширены от простого поиска до поиска с заменой. После выполнения замены функция возвращает модифицированную строку. Если совпадения

отсутствуют, строка остается в прежнем состоянии. Функция ereg_replace( ), как и еrеg( ), учитывает регистр символов. Ниже приведен простой пример, демонстрирующий применение этой функции:

$copy_date = «Copyright 1999»:

$copy_date = ereg_replace(«([0-9]+)». «2000», $copy_date);

print $copy_date: // Выводится строка «Copyright 2000»

У средств поиска с заменой в языке PHP имеется одна интересная возможность — возможность использования обратных ссылок на части основного выражения, заключенные в круглые скобки. Обратные ссылки похожи на элементы необязательного параметра-массива совпадения функции еrеg( ) за одним исключением: обратные ссылки записываются в виде \0, \1, \2 и т. д., где \0 соответствует всей строке, \1 — успешному совпадению первого подвыражения и т. д. Выражение может содержать до 9 обратных ссылок. В следующем примере все ссылки на URL в тексте заменяются работающими гиперссылками:

$url = «Apress (http://www.apress.com»);

Функция eregi( ) ищет в заданной строке совпадение для шаблона. Синтаксис функции eregi( ):

int eregi (string шаблон, string строка [, array совпадения])

Поиск производится без учета регистра алфавитных символов. Функция eregi( ) особенно удобна при проверке правильности введенных строк (например, паролей). Использование функции eregi( ) продемонстрировано в следующем примере:

print «Invalid password! Passwords must be from 8 through 10 characters in length.»;

// В результате выполнения этого фрагмента выводится сообщение об ошибке.

// поскольку длина строки «abc» не входит в разрешенный интервал

// от 8 до 10 символов.

Функция eregi_replасе( ) работает точно так же, как ereg_replace( ), за одним исключением: поиск производится без учета регистра символов. Синтаксис функции ereg_replace( ):

string eregi_replace (string шаблон, string замена, string строка)

Функция split( ) разбивает строку на элементы, границы которых определяются по заданному шаблону. Синтаксис функции split( ):

array split (string шаблон, string строка [, int порог])

Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка слева направо. Если шаблон содержит алфавитные символы, функция spl it( ) работает с учетом регистра символов. Следующий пример демонстрирует использование функции split( ) для разбиения канонического IP-адреса на триплеты:

$ip = «123.345.789.000»; // Канонический IP-адрес

$iparr = split («\.», $ip) // Поскольку точка является служебным символом.

// ее необходимо экранировать.

print «$iparr[0]
«; // Выводит «123»

print «$iparr[1]
«; // Выводит «456»

print «$iparr[2]
«; // Выводит «789»

print «$iparr[3]
«; // Выводит «000»

Функция spliti( ) работает точно так же, как ее прототип split( ), за одним исключением: она не учитывает регистра символов. Синтаксис функции spliti( ):

array spliti (string шаблон, string строка [, int порог])

Разумеется, регистр символов важен лишь в том случае, если шаблон содержит алфавитные символы. Для других символов выполнение spliti( ) полностью аналогично split( ).

Вспомогательная функция sql_regcase( ) заключает каждый символ входной строки в квадратные скобки и добавляет к нему парный символ. Синтаксис функции sql_regcase( ):

string sql_regcase (string строка)

Если алфавитный символ существует в двух вариантах (верхний и нижний регистры), выражение в квадратных скобках будет содержать оба варианта; в противном случае исходный символ повторяется дважды. Функция sql_regcase( ) особенно удобна при использовании PHP с программными пакетами, поддерживающими регулярные выражения в одном регистре. Пример преобразования строки функцией sql_regcase( ):

$version = «php 4.0»;

// Выводится строка [Pp][Hh][Pp][ ][44][..][00]

Синтаксис регулярных выражений в стиле Perl

Perl ( http://www.perl.com ) давно считается одним из самых лучших языков обработки текстов. Синтаксис Perl позволяет осуществлять поиск и замену даже для самых сложных шаблонов. Разработчики РHР сочли, что не стоит заново изобретать уже изобретенное, а лучше сделать знаменитый синтаксис регулярных выражений Perl доступным для пользователей PHP. Так появились функции для работы с регулярными выражениями в стиле Perl.

Диалект регулярных выражений Perl не так уж сильно отличается от диалекта POSIX. В сущности, синтаксис регулярных выражений Perl является отдаленным потомком реализации POSIX, вследствие чего синтаксис POSIX почти совместим с функциями регулярных выражений стиля Perl.

Оставшаяся часть этого раздела будет посвящена краткому знакомству с диалектом регулярных выражений Perl. Рассмотрим простой пример:

Обратите внимание: строка food заключена между двумя косыми чертами. Как и в стандарте POSIX, вы можете создавать более сложные шаблоны при помощи квантификаторов:

Этот шаблон совпадает с последовательностью fo, за которой могут следовать дополнительные символы о. Например, совпадения будут обнаружены в строках food, fool и fo4. Рассмотрим другой пример использования квантификатора:

Шаблон совпадает с символом f, за которым следуют от 2 до 4 экземпляров символа о. К числу потенциальных совпадений относятся строки fool , fooool и foosball .

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

Метасимволы

Одной из интересных особенностей Perl является использование метасимволов при поиске. Метасимвол [Следует отметить, что авторское толкование термина «метасимвол» противоречит не только всем традициям, по и официальной документации PHP. — Примеч. перев. ] представляет собой алфавитный символ с префиксом \ — признаком особой интерпретации следующего символа. Например, метасимвол \d может использоваться при поиске денежных сумм:

Комбинация \d обозначает любую цифру. Конечно, в процессе поиска часто возникает задача идентификации алфавитно-цифровых символов, поэтому в Perl для них был определен метасимвол \w:

Этот шаблон совпадает с конструкциями, заключенными в угловые скобки, — например, тёгами HTML. Кстати, метасимвол \W имеет прямо противоположный смысл и используется для идентификации символов, не являющихся алфавитно-цифровыми.

Еще один полезный метасимвол, \b, совпадает с границами слов:

Поскольку метасимвол границы слова расположен справа от текста, этот шаблон совпадет в строках salsa и lisa, но не в строке sand. Противоположный метасимвол, \В, совпадает с чем угодно, кроме границы слова:

Шаблон совпадает в таких строках, как sand и Sally, но не совпадает в строке salsa.

Модификаторы

Модификаторы заметно упрощают работу с регулярными выражениями. Впрочем, модификаторов много, и в табл. 8.1 приведены лишь наиболее интересные из них. Модификаторы перечисляются сразу же после регулярного выражения — например, /string/i.

Таблица 8.1. Примеры модификаторов

m Фрагмент текста интерпретируется как состоящий из нескольких «логических строк». По умолчанию специальные символы ^ и $ совпадают только в начале и в конце всего фрагмента. При включении «многострочного режима» при помощи модификатора m^ и $ будут совпадать в начале и в конце каждой логической строки внутри фрагмента s По смыслу противоположен модификатору m — при поиске фрагмент интерпретируется как одна строка, а все внутренние символы новой строки игнорируются i Поиск выполняется без учета регистра символов

Вводный курс получился очень кратким, поскольку полноценное описание по регулярным выражениям выходит за рамки этой книги и требует нескольких глав вместо нескольких страниц. За дополнительной информацией о синтаксисе регулярных выражений обращайтесь к следующим ресурсам Интернета:

Функции PHP для работы с регулярными выражениями (Perl-совместимые)

В PHP существует пять функций поиска по шаблону с использованием Perl-совместимых регулярных выражений:

  • preg_match( );
  • preg_match_all( );
  • preg_replace( );
  • preg_split( );
  • preg_grep( ).

Эти функции подробно описаны в следующих разделах.

Функция pregjnatch( ) ищет в заданной строке совпадение для шаблона. Если совпадение найдено, возвращается TRUE, в противном случае возвращается FALSE. Синтаксис функции pregjnatch( ):

int pregjnatch (string шаблон, string строка [, array совпадения>)

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

$linе = «Vi is the greatest word processor ever created!»;

// Выполнить поиск слова «Vi» без учета регистра символов:

if (preg_match(«/\bVi\b\i», $line, $matcn)) :

print «Match found!»;

// Команда if в этом примере возвращает TRUE

Функция preg_match_all( ) находит все совпадения шаблона в заданной строке.

Синтаксис функции preg_match_all( ):

Int preg_match_all (string шаблон, string строка, array совпадения [, int порядок])

Порядок сохранения в массиве совпадения текста, совпавшего с подвыражениями, определяется необязательным параметром порядок. Этот параметр может принимать два значения:

  • PREG_PATTERN_ORDER — используется по умолчанию, если параметр порядок не указан. Порядок, определяемый значением PREG_PATTERN_ORDER, на первый взгляд выглядит не совсем логично: первый элемент (с индексом 0) содержит массив совпадений для всего регулярного выражения, второй элемент (с индексом 1) содержит массив всех совпадений для первого подвыражения в круглых скобках и т. д.;
  • PREG_SET_ORDER — порядок сортировки массива несколько отличается от принятого по умолчанию. Первый элемент (с индексом 0) содержит массив с текстом, совпавшим со всеми подвыражениями в круглых скобках для первого найденного совпадения. Второй элемент (с индексом 1) содержит аналогичный массив для второго найденного совпадения и т. д.

Следующий пример показывает, как при помощи функции preg_match_al( ) найти весь текст, заключенный между тегами HTML . :

$user_info = «Name: Rasmus Lerdorf
Title: PHP Guru«;

preg_match_all («/(.*) /U», Suserinfo. $pat_array);

print $pat_array[0][0].»
«.pat_array[0][l].»\n»:

Функция preg_repl ace( ) работает точно так же, как и ereg_replасе( ), за одним исключением — регулярные выражения могут использоваться в обоих параметрах, шаблон и замена. Синтаксис функции preg_replace( ):

mixed preg_replace (mixed шаблон, mixed замена, mixed строка [, int порог])

Необязательный параметр порог определяет максимальное количество замен в строке. Интересный факт: параметры шаблон и замена могут представлять собой масивы. Функция preg_replace( ) перебирает элементы обоих массивов и выполняет замену по мере их нахождения.

Функция preg_spl it( ) аналогична split( ) за одним исключением — параметр шаблон может содержать регулярное выражение. Синтаксис функции preg_split( ):

array preg_split (string шаблон, string строка [, int порог [, int флаги]])

Необязательный параметр порог определяет максимальное количество элементов, на которые делится строка. В следующем примере функция preg_split( ) используется для выборки информации из переменной.

$fields = preg_split(«/\+<1.>/», $user_info);

while ($x 0, если строка2 меньше, чем строка1.

В следующем фрагменте сравниваются две одинаковые строки:

if ((strcmp($string1. $string2)) == 0) :

print «Strings are equivalent!»; endif;

// Команда if возвращает TRUE

Функция strcasecmp( ) работает точно так же, как strcmp( ), за одним исключением — регистр символов при сравнении не учитывается. Синтаксис функции strcasecmp( ):

int strcasecmp (string cтpoкa1, string строка2)

В следующем фрагменте сравниваются две одинаковые строки:

if ((strcmp($string1, $string2)) == 0) :

print «Strings are equivalent!»;

// Команда if возвращает TRUE

Функция strspn( ) возвращает длину первого сегмента строки1, содержащего символы, присутствующие в строке2. Синтаксис функции strspn( ):

int strspn (string строка1, string строка2)

Следующий фрагмент показывает, как функция strspn( ) используется для проверки пароля:

if (strspn($password, «1234567890») != strlen($password)) :

print «Password cannot consist solely of numbers!»;

Функция strcspn( ) возвращает длину первого сегмента строки1, содержащего символы, отсутствующие в строке2. Синтаксис функции strcspn( ):

int strcspn (string строка1, string строка2)

В следующем фрагменте функция strcspn( ) используется для проверки пароля:


if (strcspn($password, «1234567890») == 0) :

print «Password cannot consist solely of numbers!»;

Обработка строковых данных без применения регулярных выражений

При обработке больших объемов информации функции регулярных выражений сильно замедляют выполнение программы. Эти функции следует применять лишь при обработке относительно сложных строк, в которых регулярные выражения действительно необходимы. Если же анализ текста выполняется по относительно простым правилам, можно воспользоваться стандартными функциями PHP, которые заметно ускоряют обработку. Все эти функции описаны ниже.

Функция strtok( ) разбивает строку на лексемы по разделителям, заданным вторым параметром. Синтаксис функции strtok( ):

string strtok (string строка, string разделители)

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

$info = «WJ Gi1more:wjgilmore@hotmail.com | Columbus, Ohio»;

// Ограничители — двоеточие (:), вертикальная черта (|) и запятая (.) $tokens = «:|,»;

$tokenized = strtok($info, $tokens);

// Вывести элементы массива $tokenized

echo «Element = $tokenized
«;

// Обратите внимание: при последующих вызовах strtok

// первый аргумент не передается

Функция parse_str( ) выделяет в строке пары «переменная-значение» и присваивает значения переменных в текущей области видимости. Синтаксис функции parse_str( ):

void parse_str (string строка)

Функция parse_str( ) особенно удобна при обработке URL, содержащих данные форм HTML или другую расширенную информацию. В следующем примере анализируется информация, переданная через URL. Строка представляет собой стандартный способ передачи данных между страницами либо откомпилированных в гиперссылке, либо введенных в форму HTML:

// После выполнения parse_str( ) доступны следующие переменные:

Поскольку эта функция создавалась для работы с URL, она игнорирует символ амперсанд (&).

Работа с формами HTML в PHP описана в главе 10.

Функция explode( ) делит строку на элементы и возвращает эти элементы в виде массива. Синтаксис функции explode( ):

array explode (string разделитель, string строка [, int порог])

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

$info = «wilson | baseball | indians»;

$user = explode(«|», $info);

Функция explode( ) практически идентична функции регулярных выражений POSIX split( ), описанной выше. Главное различие заключается в том, что передача регулярных выражений в параметрах допускается только при вызове split( ).

Если функция explode( ) разделяет строку на элементы массива, то ее двойник — функция implode( ) — объединяет массив в строку. Синтаксис функции implode( ):

string implode (string разделитель, array фрагменты)

Формирование строки из массива продемонстрировано в следующем примере:

$ohio_cities = array («Columbus», «Youngstown», «Cleveland», «Cincinnati»);

$city_string = implode(«l», $ohio_cities);

// $city_string = «Columbus | Youngstown | Cleveland | Cincinnati»;

У implode( ) имеется псевдоним — функция join( ).

Функция strpos( ) находит в строке первый экземпляр заданной подстроки. Синтаксис функции strpos( ):

int strpos (string строка, string подстрока [, int смещение])

Необязательный параметр offset задает позицию, с которой должен начинаться поиск. Если подстрока не найдена, strpos( ) возвращает FALSE (0).

В следующем примере определяется позиция первого вхождения даты в файл журнала:

// В какой позиции в журнале впервые встречается 1999 год?

$pos = strpos($log, «1999»);

// $pos = 95. поскольку первый экземпляр «1999»

// находится в позиции 95 строки, содержащейся в переменной $log

Функция strrpos( ) находит в строке последний экземпляр заданного символа. Синтаксис функции strrpos( ):

int strpos (string строка, char символ)

По возможностям эта функция уступает своему двойнику — функции strpos( ), поскольку она позволяет искать только отдельный символ, а не всю строку. Если во втором параметре strrpos( ) передается строка, при поиске будет использован только ее первый символ.

Функция str_replace( ) ищет в строке все вхождения заданной подстроки и заменяет их новой подстрокой. Синтаксис функции str_replace( ):

string str_replace (string подстрока, string замена, string строка)

Функция substr_replace( ), описанная ниже в этом разделе, позволяет провести заме ну лишь в определенной части строки. Ниже показано, как функция str_replace( ) используется для проведения глобальной замены в строке.

Если подстрока ни разу не встречается в строке, исходная строка не изменяется:

$favorite_food = «My favorite foods are ice cream and chicken wings»;

$favorite_food = str_replace(«chicken_wings», «pizza», $favohte_food);

// $favorite_food = «My favorite foods are ice cream and pizza»

Функция strstr( ) возвращает часть строки, начинающуюся с первого вхождения заданной подстроки. Синтаксис функции strstr( ):

string strstr (string строка, string подстрока)

В следующем примере функция strstr( ) используется для выделения имени домена из URL:

$url = «http://www.apress.com»; $domain — strstr($url, «.»);

Функция substr( ) возвращает часть строки, начинающуюся с заданной начальной позиции и имеющую заданную длину. Синтаксис функции substr( ):

string substr (string строка, int начало [, int длина])

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

  • если параметр начало положителен, возвращаемая подстрока начинается с позиции строки с заданным номером;
  • если параметр начало отрицателен, возвращаемая подстрока начинается с позиции (длина строки — начало);
  • если параметр длина положителен, в возвращаемую подстроку включаются все символы от позиции начало до позиции начало+длина. Если последняявеличина превышает длину строки, возвращаются символы до конца строки;
  • если параметр длина отрицателен, возвращаемая подстрока заканчивается на заданном расстоянии от конца строки.

Помните о том, что параметр начало определяет смещение от первого символа строки; таким образом, возвращаемая строка в действительности начинается с символа с номером (начало + 1).

Следующий пример демонстрирует выделение части строки функцией substr( ):

$car = «1944 Ford»; Smodel = substr($car, 6);

Пример с положительным параметром длина:

$model = substr($car, 0, 4);

Пример с отрицательным параметром длина:

$model = substr($car, 2, -5);

Функция substr_count( ) возвращает количество вхождений подстроки в заданную строку. Синтаксис функции substr_count( ):

int substr_count (string строка, string подстрока)

В следующем примере функция substr_count( ) подсчитывает количество вхождений подстроки ain:

$tng_twist = «The rain falls mainly on the plains of Spain»;

$count = substr_count($tng_twist, «ain»);

Функция substr_replace( ) заменяет часть строки, которая начинается с заданной позиции. Если задан необязательный параметр длина, заменяется фрагмент заданной длины; в противном случае производится замена по всей длине заменяющей строки. Синтаксис функции substr_replace( ):

string substr_replace (string строка, string замена, int начало [, int длина])

Параметры начало и длина задаются по определенным правилам:

  • если параметр начало положителен, замена начинается с заданной позиции;
  • если параметр начало отрицателен, замена начинается с позиции (длина строки -начало);
  • если параметр длина положителен, заменяется фрагмент заданной длины;
  • если параметр длина отрицателен, замена завершается в позиции (длина строки -длина).

Простая замена текста функцией substr_replace( ) продемонстрирована в следующем примере:

$favs = » ‘s favorite links»;

// Параметры «0, 0» означают, что заменяемый фрагмент начинается

// и завершается в первой позиции строки.

$favs — substr_replace($favs, $name, 0, 0);

Alessia’s favorite links

Преобразование строк и файлов к формату HTML и наоборот

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

Преобразование текста в HTML

Быстрое преобразование простого текста к формату web-браузера — весьма распространенная задача. В ее решении вам помогут функции, описанные в этом разделе.

Функция nl2br( ) заменяет все символы новой строки (\n) эквивалентными конструкциями HTML
.

Синтаксис функции nl2br( ):

string nl2br (string строка)

Символы новой строки могут быть как видимыми (то есть явно включенными в строку), так и невидимыми (например, введенными в редакторе). В следующем примере текстовая строка преобразуется в формат HTML посредством замены символов \n разрывами строк:

// Текстовая строка, отображаемая в редакторе.

Party Sauce recipe:

1 can stewed tomatoes

3 tablespoons fresh lemon juice

Stir together, server cold.»;

// Преобразовать символы новой строки в

При последующем выводе $html_recipe браузеру будет передан следующий текст в формате HTML:

Party Sauce recipe:

1 can stewed tomatoes

3 tablespoons fresh lemon juice

Stir together, server cold.

Функция htmlentities( ) преобразует символы в эквивалентные конструкции HTML. Синтаксис функции htmlentities:

string htmlentities (string строка)

В следующем примере производится необходимая замена символов строки для вывода в браузере:

$user_input = «The cookbook, entitled Cafe Francaise’ costs преобразуется в >.

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

Следующий пример демонстрирует удаление потенциально опасных символов функцией htmlspeclalchars( ):

$user_input = «I just can’t get «enough» of PHP & those fabulous cooking recipes!»;

// $conv_input = «I just can’t > of PHP &amp those fabulous cooking

Если функция htmlspecialchars( ) используется в сочетании с nl2br( ), то последнюю следует вызывать после htmlspecialchars( ). В противном случае конструкции
, сгенерированные при вызове nl2br( ), преобразуются в видимые символы.

Функция get_html_translation_table( ) обеспечивает удобные средства преобразования текста в эквиваленты HTML Синтаксис функции get_htrril_translation_table( ):

string get_html_translation_table (int таблица)

Функция get_html_translation_table( ) возвращает одну из двух таблиц преобразования (определяется параметром таблица), используемых в работе стандартных функций htmlspecialchars( ) и htmlentities( ). Возвращаемое значение может использоваться в сочетании с другой стандартной функцией, strtr( ) (см. далее), для преобразования текста в код HTML.

Параметр таблица принимает одно из двух значений:

В следующем примере функция get_html_translation_table( ) используется при преобразовании текста в код HTML:

$string = «La pasta e il piatto piu amato in Italia»;

print strtr($string, $translate);

// Специальные символы преобразуются в конструкции HTML

// и правильно отображаются в браузере.

Кстати, функция array_flip( ) позволяет провести преобразование текста в HTML в обратном направлении и восстановить исходный текст. Предположим, что вместо вывода результата strtr( ) в предыдущем примере мы присвоили его переменной $translated string.

В следующем примере исходный текст восстанавливается функцией array_flip( ):

$translated_string — «La pasta é il piatto piú amato in Italia»;

$original_string = strtr($translated_string, $translate);

// $original_string = «La pasta e il piatto piu amato in Italia»;

Функция strtr( ) транслирует строку, то есть заменяет в ней все символы, входящие в строку источник, соответствующими символами строки приемник. Синтаксис функции strtr( ):

string strtr (string строка, string источник, string приемник)

Если строки источник и приемник имеют разную длину, длинная строка усекается до размеров короткой строки.

Существует альтернативный синтаксис вызова strtr( ) с двумя параметрами; в этом случае второй параметр содержит ассоциативный массив, ключи которого соответствуют заменяемым подстрокам, а значения — заменяющим подстрокам. В следующем примере теги HTML заменяются XML-подобными конструкциями:

Today In PHP-Powered News»

print strtr($string, $source);

// Выводится строка » Today in PHP-Powered News «

Преобразование HTML в простой текст

Иногда возникает необходимость преобразовать файл в формате HTML в простой текст. Функции, описанные ниже, помогут вам в решении этой задачи.

Функция strip_tags( ) удаляет из строки все теги HTML и PHP, оставляяв ней только текст. Синтаксис функции strip_tags( ):

string strip_tags (string строка [, string разрешенные_тerи])

Необязательный параметр разрешенные_теги позволяет указать теги, которые должны пропускаться в процессе удаления.

Ниже приведен пример удаления из строки всех тегов HTML функцией strip_tags( ):

$user_input = «I just love PHP and gourment recipes!»;

// $stripped_input = «I just love PHP and gourmet recipes!»;

В следующем примере удаляются не все, а лишь некоторые теги:

$strip_input = strip_tags ($user_input, «»);

// $strip_input = «I love to eat!!»;

Удаление тегов из текста также производится функцией fgetss( ), описанной в главе 7.

Хотя функция get_meta_tags( ) и не имеет прямого отношения к преобразованию текста, зто весьма полезная функция, о которой следует упомянуть. Синтаксис функции get_meta_tags( ):

array get_meta_tags (string имя_файла/URL [, int включение_пути])

Функция get_meta_tags( ) предназначена для поиска в файле HTML тегов МЕТА.

Теги МЕТА содержат информацию о странице, используемую главным образом поисковыми системами. Эти теги находятся внутри пары тегов . . Применение тегов МЕТА продемонстрировано в следующем фрагменте (назовем его example.html, поскольку он будет использоваться в листинге 8.2):

Функция get_meta_tags( ) ищет в заголовке документа теги, начинающиеся словом МЕТА, и сохраняет имена тегов и их содержимое в ассоциативном массиве. В листинге 8.2 продемонстрировано применение этой функции к файлу example.html.

Листинг 8.2. Извлечение тегов МЕТА из файла HTML функцией get_meta_tags( )

// Переменная $meta_tags содержит массив со следующей информацией:

// $meta_tags[«keywords»] = «gourmet. PHP. food. code, recipes, chef, programming. Web»:

// $meta_tags[«description»] = «PHP Recipes provides savvy readers with the latest in PHP

programming and gourmet cuisine»;

// $meta_tags[«author»] = «WJ Gilmore»;

Интересная подробность: данные тегов МЕТА можно извлекать не только из файлов, находящихся на сервере, но и из других URL.

Теги МЕТА и их использование превосходно описаны в статье Джо Берна (Joe Burn) «So, You Want a Meta Command, Huh?» на сайте HTML Goodies: http://htmlgoodies.earthweb.com/tutors/meta.html .

Преобразование строки к верхнему и нижнему регистру

В PHP существует четыре функции, предназначенных для изменения регистра строки:

Все эти функции подробно описаны ниже.


Функция strtolower( ) преобразует все алфавитные символы строки к нижнему регистру. Синтаксис функции strtolower( ):

string strtolower(string строка)

Неалфавитные символы функцией не изменяются. Преобразование строки к нижнему регистру функцией strtolower( ) продемонстрировано в следующем примере:

$sentence = «COOKING and PROGRAMMING PHP are my TWO favorite pastimes!»;

// После вызова функции $sentence содержит строку

// «cooking and programming php are my two favorite pastimes!»

Строки можно преобразовывать не только к нижнему, но и к верхнему регистру. Преобразование выполняется функцией strtoupper( ), имеющей следующий синтаксис:

string strtoupper (string строка)

Неалфавитные символы функцией не изменяются. Преобразование строки к верхнему регистру функцией strtoupper( ) продемонстрировано в следующем примере:

$sentence = «cooking and programming PHP are my two favorite pastimes!»;

// После вызова функции $sentence содержит строку

// «COOKING AND PROGRAMMING PHP ARE MY TWO FAVORITE PASTIMES!»

Функция ucfirst( ) преобразует к верхнему регистру первый символ строки — при условии, что он является алфавитным символом. Синтаксис функции ucfirst( ):

string ucfirst (string строка)

Неалфавитные символы функцией не изменяются. Преобразование первого символа строки функцией ucfirst( ) продемонстрировано в следующем примере:

// После вызова функции $sentence содержит строку

// «Cooking and programming PHP are mу two favorite pastimes!»

Функция ucwords( ) преобразует к верхнему регистру первую букву каждого слова в строке. Синтаксис функции ucwords( ):

string ucwords (string строка»)

Неалфавитные символы функцией не изменяются. «Слово» определяется как последовательность символов, отделенная от других элементов строки пробелами. В следующем примере продемонстрировано преобразование первых символов слов функцией ucwords( ):

$sentence = «cooking and programming PHP are my two favorite pastimes!»;

// После вызова функции $sentence содержит строку

// «Cooking And Programming PHP Are My Two Favorite Pastimes!»

Проект: идентификация браузера

Каждый программист, пытающийся создать удобный web-сайт, должен учитывать различия в форматировании страниц при просмотре сайта в разных браузерах и операционных системах. Хотя консорциум W3 (http://www.w3.org) продолжает публиковать стандарты, которых должны придерживаться программисты при создании web-приложений, разработчики браузеров любят дополнять эти стандарты своими маленькими «усовершенствованиями», что в конечном счете вызывает хаос и путаницу. Разработчики часто решают эту проблему, создавая разные страницы для каждого типа браузера и операционной системы — при этом объем работы значительно увеличивается, но зато итоговый сайт идеально подходит для любого пользователя. Результат — хорошая репутация сайта и уверенность в том, что пользователь посетит его снова.

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

Приведенный ниже проект (sniffer.php) показывает, как использовать функции PHP для работы с регулярными выражениям с целью получения информации по запросам. Программа определяет тип и версию браузера и операционной системы, после чего выводит полученную информацию в окне браузера. Но прежде чем переходить к непосредственному анализу программы, я хочу представить один из главных ее компонентов — стандартную переменную PHP $HTTP_USER_AGENT. В этой переменной в строковом формате хранятся различные сведения о браузере и операционной системе пользователя — именно то, что нас интересует. Эту информацию можно легко вывести на экран всего одной командой:

При работе в Internet Explorer 5.0 на компьютере с Windows 98 результат будет выглядеть так:

Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)

Для Netscape Navigator 4.75 выводятся следующие данные:

Mozilla/4.75 (Win98; U)

Sniffer.php извлекает необходимые данные из $HTTP_USER_AGENT при помощи функций обработки строк и регулярных выражений. Алгоритм программы на псевдокоде:

  • Определить две функции для идентификации браузера и операционной системы: browser_info( ) и opsys_info( ). Начнем с псевдокода функции browser_info( ).
  • Определить тип браузера, используя функцию егед( ). Хотя эта функция работает медленнее упрощенных строковых функций типа strstr( ), в данном случае она удобнее, поскольку регулярное выражение позволяет определить версию браузера.
  • Воспользоваться конструкцией if/elseif для идентификации следующих браузеров и их версий: Internet Explorer, Opera, Netscape и браузер неизвестного типа.
  • Вернуть информацию о типе и версии браузера в виде массива.
  • Функция opsys_info( ) определяет тип операционной системы. На этот раз используется функция strstr( ), поскольку тип ОС определяется и без применения регулярных выражений.
  • Воспользоваться конструкцией if/elseif для идентификации следующих систем: Windows, Linux, UNIX, Macintosh и неизвестная операционная система.
  • Вернуть информацию об операционной системе.

Листинг 8.3. Идентификация типа браузера и операционной системы клиента

Вот и все! Например, если пользователь работает в браузере Netscape 4.75 на компьютере с системой Windows, будет выведен следующий результат:

Browser Type: Netscape

Browser Version: 4.75

Operating System: Windows

В следующей главе вы научитесь осуществлять переходы между страницами и даже создавать списки стилей (style sheets) для конкретных операционной системы и браузера.

Итоги

В этой главе был изложен довольно обширный материал. Какой прок от языка программирования, если в нем нельзя работать с текстом? Мы рассмотрели следующие темы:

  • общие сведения о регулярных выражениях в стилях POSIX и Perl;
  • стандартные функции PHP для работы с регулярными выражениями;
  • изменение длины строки;
  • определение длины строки;
  • альтернативные функции PHP для обработки строковой информации;
  • преобразование простого текста в HTML и наоборот;
  • изменение регистра символов в строках.

Следующая глава открывает вторую часть книги — кстати, мою любимую. В ней мы начнем знакомиться со средствами PHP, ориентированными на Web, рассмотрим процесс динамического создания содержимого, включение файлов и построение общих шаблонов. В дальнейших главах части 2 рассматриваются работа с формами HTML, базы данных, отслеживание данных сеанса и нетривиальные средства работы с шаблонами. Держитесь — начинается самое интересное!

Обработка строк в рнр

Одной из наиболее часто встречающихся задач в программировании является обработка символьных последовательностей. Если проще — строк. Как это делается на языке гипертекстового препроцессора РНР и есть тема этой статьи.

Откуда и как можно получить символьнуюпоследовательность? В самом простомслучае — присвоить ее нужной переменной.Другие варианты — получить из формы илииз файла. Если Вы присваиваетепеременной нужное значение, то оно, какправило, не нуждается в обработке, таккак программист делает присвоение вкоде программы, и конечно, в нужном виде.Но если строка считывается из файла, илиполучается посредством формы, она (символьнаястрока) нуждается в обработке.

Самое первое, что стоит сделать, это удалить повторяющиеся пробелы. Дляэтого в РНР есть специальная функция: chop(str);
Пример ее записи:

В результате, обработанное значениестроки $str не будет содержатьповторяющихся пробелов. Если нужноубедиться в том, что строка не содержитпробелов в начале и в конце, применяетсяфункция trim(str); ( $str = trim ($str); ). Когдатребуется удалить пробелы только сначала строки, нужно использовать ltrim. Иесли уж зашла речь о начале строки,давайте убедимся, что первый символзаглавный. Что бы сделать его таковым,примените ucfirst(str); Есть и функция дляперевода во всех словах в строке ихпервых букв в заглавные — ucwords(str);. Крометого, очень часто бывает необходимосравнить строку с некоторым шаблоном.Частный случай — поиск в строке (о немнесколько позже). Но нет никакойгарантии, что полученная строка введенапользователем или получена из файла всоответствии с правилами правописания.Другими словами — строка можетсодержать в середине слова илипредложения чередующиеся заглавные ипрописные символы. Решение даннойпроблемы — в применении функций strtolower(str);и strtoupper(st);. Эти функции, соответственно,переводят символьные строки в нижний иверхний регистр. Комбинирование данныхвозможностей языка РНР приводит ккорректному построению строки независимо от того, как она была введенаили получена в начальном виде.

Еще одна необходимая вещь при работе состроками — их обрезка. Часто онаприменяется при обработке форм дляввода данных. Представьте, что кто-нибудьиз Ваших «доброжелателей» введет в Вашугостевую книгу текст этой статьи.Представляете, что получится? Вот дляэтого и нужно ограничить количествовводимых символов в любом поле формы.Тем более что делается это очень просто.Для начала, нужно прописать ограничениев самой форме:

Теперь форма с именем form ограничена вколичестве вводимых символов числом 100.Но это еще далеко не все. Дело в том, чтообойти такое ограничение очень просто, инужно оно скорее для того, что быпоказать посетителю предел ограничения.Дальше нужно воспользоваться функциейРНР $form =substr($form,0,99);. Этим вы простоотрезаете часть полученной строки,превышающую 100 символов (стоит цифра 99,так как счет символов начинается с нуля).Теперь все потуги Ваших знакомыхзавалить Вас информацией будут тщетны,так как Ваш умный скрипт не пропуститбольше определенного Вами количествасимволов.

Собственно говоря, у функции substr(string, start,length); совсем другое предназначение. Онавозвращает часть строки string,определяемую параметрами start (начало) иlength (длина). Если параметр startположительный, то возвращаемая строкабудет начинаться с start-ого символастроки string.
Примеры:

$form = substr(«abcdef», 1); // вернет «bcdef»
$form = substr(«abcdef», 1, 3); // вернет «bcd»

Если параметр start отрицательный, товозвращаемая строка будет начинатьсяstart-ого символа от конца строки string.
Примеры:

$rest = substr(«abcdef», -1); // вернет «f»
$rest = substr(«abcdef», -2); // вернет «ef»
$rest = substr(«abcdef», -3, 1); // вернет «d»

Если параметр length указан и онположительный, то возвращаемая строказакончится за length символов от начала start.Это приведет к строке с отрицательнойдлиной (потому что начало будет законцом строки), поэтому возвращаемаястрока будет содержать один символ отначала строки start. Если length указан и онотрицательный, то возвращаемая строказакончится за length от конца строки string.Это опять приведет к строке сотрицательной длиной, поэтомувозвращаемая строка будет содержатьодин символ от начала строки start.
Примеры:

$rest = substr(«abcdef», -1, -1); // вернет «bcde»

Вот такая полезная функция. Кроме нее,при обработке данных формы очень важноуметь вырезать из полученной строкилишние или просто недопустимые символы.Можно в этом случае применитьспециальную функцию, которая заменяетвсе вхождения строки needle в строке haystackна указанную строку str. Эта функциязаписывается так: str_replace(needle, str, haystack);.Если вам не требуются причудливыеправила замены, то вам следует всегдаиспользовать эту функцию вместо ereg_replace().
Примеры:

$str = str_replace(«», «n», $str); //вырезается символ ввода.
$str = str_replace(«red», «black», $str); // встроке черный цвет будет заменен накрасный.

Следующая важная и полезная функция –нахождение длинны строки. Синтаксис -strlen(string str);Пример — $a = strlen(“qwerty”);. Впеременной $a будет число 6, так какдлинна строки — 6 символов. Еще однаинтересная возможность языка РНР –перевод текста (а значит — и символьныхстрок) из одной кодировки в другую. Этоочень полезно, если нужно согласоватькодировки, например, сайта и почтовойпрограммы. Причем поддерживаются самыераспространенные русские кодировки: stringconvert_cyr_string(str, from, to);. Аргументы from и toявляются одним символом, которыйопределяет исходную и целевую кодовуютаблицу. Поддерживаемые типы:
k — koi8-r
w — windows-1251
i — iso8859-5
a — x-cp866
d — x-cp866
m — x-mac-cyrillic

Htmlspecialchars — переводит специальныесимволы в коды HTML. Htmlspecialchars( string);Определенные символы имеют особоезначение в HTML и должны быть замененыкодами HTML, если они таковые имеют. Этафункция возвращает строки спроизведенными такими изменениями.Функция полезна для отчисткиполученного от пользователя текста отразметки HTML (доски сообщений, гостевыекниги). Осуществляются следующие замены:
‘&’ (амперсанд) становится ‘&’
‘»‘ (двойные кавычки) становится ‘»‘
‘ ‘ (знак больше) становится ‘>’

Следует отметить, что эта функция незаменяет ничего, кроме указанного выше.Для полной обработки применяют функциюhtmlentities(). Она переводит все возможныесимволы в коды HTML. Htmlentities(string); Этафункция идентична htmlspecialchars() , кроме того,что все символы, которые имеютсоответствующий код HTML, заменяются наэтот HTML код. В настоящее времяприменяется кодовая таблица ISO-8859-1.

Отдельно следует рассмотреть функциипоиска в строке. Strchr — Находит первоепоявление символа. strchr(haystack, needle); Этафункция является псевдонимом дляфункции strstr(), и полностью ей идентична.Возвращает все haystack с первого появлениястроки needle и до конца. Если параметр needleне найден, то возвращается false. Еслипараметр needle не является строкой, то онпереводится в целое число ирассматривается как числовое значениесимвола. Strrpos — Находит позициюпоследнего появления символа в строке.Strrpos(haystack, needle); Возвращает номер позициипоследнего появления символа needle встроке haystack. Следует отметить, что needle вэтом случае может быть толькоединственным символом. Если в качествепараметра needle указывается строка, тотолько первый символ будет использован.Если needle не найден, то возвращается false.Если параметр needle не является строкой,то он переводится в десятичное число ирассматривается как числовое значениесимвола. Strrchr — Находит последнеепоявление символа в строке.
Strrchr(haystack, needle); Эта функция возвращаетпозицию haystack, с которой начинаетсяпоследнее появление needle и продолжаетсядо конца haystack. Возвращает false если needle ненайдена. Если параметр needle содержитболее чем один символ, то используетсяпервый символ. Если параметр needle неявляется строкой, то он переводится вцелое число и рассматривается какчисловое значение символа.
Пример:

// получение всего после последней новойстроки
$text = «Line 1nLine 2nLine 3»;
$last = substr( strrchr( $text, 10 ), 1 );

Strtok — разбивает строку. strtok( arg1, arg2);Используется для разбиения строки. Этозначит, что если вы имеете строку типа»Как хорошо программировать», то выможете разбить эту строку на отдельныеслова, используя пробел в качестверазделителя.

$string = » Как хорошо программировать»;
$tok = strtok($string,» «);
while($tok) < echo "Word=$tok
«; $tok = strtok(«»); >

Следует отметить, что только первыйвызов функции strtok использует строковыйаргумент. Для каждого последующеговызова функции strtok необходим толькоразделитель, так как это позволяетконтролировать положение в текущейстроке. Для начала заново или дляразбития новой строки вам необходимопросто вызвать strtok с параметром строкиопять для ее инициализации. Вы можетевставлять несколько разделителей впараметр разделителя. Строка будетразделяться при обнаружении любого изуказанных символов. Также будьтевнимательны к разделителям равным»0″. Это может вызвать ошибку вопределенных выражениях.

Вот то, что понадобится Вам для работы состроками в первую очередь. Тут приведендалеко не полный перечень всехстроковых функций. Рассмотрены только самые основные

Статья Обработка строк в РНР

Осталось ждать: 20 сек.

Установите безопасный браузер

Предпросмотр документа

-3810381000Бинго! Ты только что нашел решение своей проблемы! Только давай договоримся – ты прочтешь текст до конца, окей? :)

Давай начистоту — тут один шлак, лучше закажи работу на HYPERLINK «http://author-24.site/» author-24.site и не парься – мы все сделаем за тебя! Даже если остался день до сдачи работы – мы справимся, и ты получишь «Отлично» по своему предмету! Только представь: ты занимаешься своим любимым делом, пока твои лохи-одногруппники теряют свои нервные клетки…

Проникнись… Это бесценное ощущение :)

Курсовая, диплом, реферат, статья, эссе, чертежи, задачи по матану, контрольная или творческая работа – всё это ты можешь передать нам, наслаждаться своей молодостью, гулять с друзьями и радовать родителей отличными оценками. А если преподу что-то не понравится, то мы бесплатно переделаем так, что он пустит слезу от счастья и поставит твою работу в рамочку как образец качества.

Еще сомневаешься? Мы готовы подарить тебе сотни часов свободного времени за смешную цену – что тут думать-то? Жизнь одна – не трать ее на всякую фигню!

Перейди на наш сайт HYPERLINK «http://author-24.site/» author-24.site — обещаю, тебе понравится! :)

А работа, которую ты искал, находится ниже :)

Обработка строк в РНР

Одной из наиболее часто встречающихся задач в программировании является обработка символьных последовательностей. Если проще – строк. Как это делается на языке гипертекстового препроцессора РНР и есть тема этой статьи.

Откуда и как можно получить символьную последовательность? В самом простом случае – присвоить ее нужной переменной. Другие варианты – получить из формы или из файла. Если Вы присваиваете переменной нужное значение, то оно, как правило, не нуждается в обработке, так как программист делает присвоение в коде программы, и конечно, в нужном виде. Но если строка считывается из файла, или получается посредством формы, она (символьная строка) нуждается в обработке.

Самое первое, что стоит сделать, это удалить повторяющиеся пробелы. Для этого в РНР есть специальная функция: chop(str); Пример ее записи:

В результате, обработанное значение строки $str не будет содержать повторяющихся пробелов. Если нужно убедиться в том, что строка не содержит пробелов в начале и в конце, применяется функция trim(str); ( $str = trim ($str); ). Когда требуется удалить пробелы только с начала строки, нужно использовать ltrim. И если уж зашла речь о начале строки, давайте убедимся, что первый символ заглавный. Что бы сделать его таковым, примените ucfirst(str); Есть и функция для перевода во всех словах в строке их первых букв в заглавные — ucwords(str);. Кроме того, очень часто бывает необходимо сравнить строку с некоторым шаблоном. Частный случай – поиск в строке (о нем несколько позже). Но нет никакой гарантии, что полученная строка введена пользователем или получена из файла в соответствии с правилами правописания. Другими словами – строка может содержать в середине слова или предложения чередующиеся заглавные и прописные символы. Решение данной проблемы – в применении функций strtolower(str); и strtoupper(st);. Эти функции, соответственно, переводят символьные строки в нижний и верхний регистр. Комбинирование данных возможностей языка РНР приводит к корректному построению строки не зависимо от того, как она была введена или получена в начальном виде.

Еще одна необходимая вещь при работе со строками – их обрезка. Часто она применяется при обработке форм для ввода данных. Представьте, что кто-нибудь из Ваших введет в Вашу гостевую книгу текст этой статьи. Представляете, что получится? Вот для этого и нужно ограничить количество вводимых символов в любом поле формы. Тем более что делается это очень просто. Для начала, нужно прописать ограничение в самой форме:

Теперь форма с именем form ограничена в количестве вводимых символов числом 100. Но это еще далеко не все. Дело в том, что обойти такое ограничение очень просто, и нужно оно скорее для того, что бы показать посетителю предел ограничения. Дальше нужно воспользоваться функцией РНР $form =substr($form,0,99);. Этим вы просто отрезаете часть полученной строки, превышающую 100 символов (стоит цифра 99, так как счет символов начинается с нуля). Теперь все потуги Ваших знакомых завалить Вас информацией будут тщетны, так как Ваш умный скрипт не пропустит больше определенного Вами количества символов.

Собственно говоря, у функции substr(string, start, length); совсем другое предназначение. Она возвращает часть строки string, определяемую параметрами start (начало) и length (длина). Если параметр start положительный, то возвращаемая строка будет начинаться с start-ого символа строки string. Примеры:

$form = substr(«abcdef», 1); // вернет «bcdef»

$form = substr(«abcdef», 1, 3); // вернет «bcd»

Если параметр start отрицательный, то возвращаемая строка будет начинаться start-ого символа от конца строки string. Примеры:

$rest = substr(«abcdef», -1); // вернет «f»

$rest = substr(«abcdef», -2); // вернет «ef»

$rest = substr(«abcdef», -3, 1); // вернет «d»

Если параметр length указан и он положительный, то возвращаемая строка закончится за length символов от начала start. Это приведет к строке с отрицательной длиной (потому что начало будет за концом строки), поэтому возвращаемая строка будет содержать один символ от начала строки start. Если length указан и он отрицательный, то возвращаемая строка закончится за length от конца строки string. Это опять приведет к строке с отрицательной длиной, поэтому возвращаемая строка будет содержать один символ от начала строки start. Примеры:

$rest = substr(«abcdef», -1, -1); // вернет «bcde»

Вот такая полезная функция. Кроме нее, при обработке данных формы очень важно уметь вырезать

из полученной строки лишние или просто недопустимые символы. Можно в этом случае применить

>специальную функцию, которая заменяет все вхождения строки needle в строке haystack на

указанную строку str. Эта функция записывается так: str_replace(needle, str, haystack);.

Если вам не требуются причудливые правила замены, то вам следует всегда использовать

‘ (знак больше) становится ‘>’

Следует отметить, что эта функция не заменяет ничего, кроме указанного выше. Для полной обработки применяют функцию htmlentities(). Она переводит все возможные символы в коды HTML. Htmlentities(string); Эта функция идентична htmlspecialchars() , кроме того, что все символы, которые имеют соответствующий код HTML, заменяются на этот HTML код. В настоящее время применяется кодовая таблица ISO-8859-1.

Отдельно следует рассмотреть функции поиска в строке. Strchr — Находит первое появление символа. strchr(haystack, needle); Эта функция является псевдонимом для функции strstr(), и полностью ей идентична. Возвращает все haystack с первого появления строки needle и до конца. Если параметр needle не найден, то возвращается false. Если параметр needle не является строкой, то он переводится в целое число и рассматривается как числовое значение символа. Strrpos — Находит позицию последнего появления символа в строке. Strrpos(haystack, needle); Возвращает номер позиции последнего появления символа needle в строке haystack. Следует отметить, что needle в этом случае может быть только единственным символом. Если в качестве параметра needle указывается строка, то только первый символ будет использован. Если needle не найден, то возвращается false. Если параметр needle не является строкой, то он переводится в десятичное число и рассматривается как числовое значение символа. Strrchr — Находит последнее появление символа в строке.

Strrchr(haystack, needle); Эта функция возвращает позицию haystack, с которой начинается последнее появление needle и продолжается до конца haystack. Возвращает false если needle не найдена. Если параметр needle содержит более чем один символ, то используется первый символ. Если параметр needle не является строкой, то он переводится в целое число и рассматривается как числовое значение символа. Пример:

// получение всего после последней новой строки

$text = «Line 1nLine 2nLine 3»;

$last = substr( strrchr( $text, 10 ), 1 );

Strtok — разбивает строку. strtok( arg1, arg2); Используется для разбиения строки. Это значит, что если вы имеете строку типа «Как хорошо программировать», то вы можете разбить эту строку на отдельные слова, используя пробел в качестве разделителя.

$string = » Как хорошо программировать «;

Следует отметить, что только первый вызов функции strtok использует строковый аргумент. Для каждого последующего вызова функции strtok необходим только разделитель, так как это позволяет контролировать положение в текущей строке. Для начала заново или для разбития новой строки вам необходимо просто вызвать strtok с параметром строки опять для ее инициализации. Вы можете вставлять несколько разделителей в параметр разделителя. Строка будет разделяться при обнаружении любого из указанных символов. Также будьте внимательны к разделителям равным «0». Это может вызвать ошибку в определенных выражениях.

Строковые функции в PHP

Строки — это один из основных типов переменных в PHP. И с ними приходится работать наравне с числами, с булевскими переменными и массивами. Разумеется, разработчики PHP, чтобы облегчить нам работу со строками, уже встроили много готовых функций для нас. И о самых часто используемых мы и поговорим.

Начнём с функции, которую я использую при работе со строками в PHP регулярно — strlen(). Данная функция возвращает длину строки (количество символов в строке):

Думаю, что данная функция в комментариях не нуждается.

Также имеются две часто используемые строковые функции — это strtolower() и strtoupper(). Эти функции позволяют перевести строку в нижний и верхний регистр соответственно:

Очень полезная строковая функция — substr(), которая возвращает подстроку из исходной строки:

Как видите, данная функция может содержать два, либо три параметра. Первый параметр — это исходная строка, второй параметр — это номер символа в исходной строке, который потом станет первым в полученной строке. Обратите внимание: нумерация символов начинается с 0 (то есть в нашем примере, 1-ый символ — «h«). Третий параметр означает длину строки, которую мы хотим получить. Если этот параметр не задан, то возвращается строка, начиная со второго параметра и до конца строки. В общем, смотрите на результат, и Вам всё станет ясно.

Ещё одна полезная строковая функция в PHP — это str_replace(). Как следует из названия, данная функция возвращает строку с заменой какой-то части:

На выходе у нас получилась следующая строка: «This is your string«. То есть данная функция заменила строку, заданную первым параметром, на строку, заданную вторым параметром, в строке, заданной третьим параметром, и вернула результат.

И последняя функция, которую мы с Вами рассмотрим, — это strpos(). Данная функция ищет вхождение подстроки в строку и возвращает номер первого символа вхождения (напоминаю, что нумерация символов начинается с 0, а не с 1):

Как видите, данная функция очень простая и очень важная, так как позволяет осуществлять поиск в строке. Также у функции strpos() есть ещё один необязательный параметр, задающий смещение. Напоминаю, что данная функция ищет первое вхождение. Например, в нашем примере «is» встречается в строке дважды, но вернула эта функция номер символа при первом вхождении. Поэтому для того, чтобы получить номера и других вхождений необходимо задавать третий параметр — смещение:

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

Очевидно, что «Th» содержится в исходной строке, и номер символа первого вхождения — это . Но если Вы запустите этот скрипт, то увидите, что «строка не найдена«. Почему? Если Вы читали статью об операторе эквивалентности, то без проблем ответите на этот вопрос. Однако, если нет, то поясняю. Дело в том, что так как у нас функция strpos() вернула , а с точки зрения PHP — это false, то он без проблем сделал вывод о том, что условие истинно (ведь слева false и справа false). Как быть? Ответ прост: воспользоваться оператором эквивалентности (обозначается ===), который сравнивает не только значения (которые в нашем примере равны для PHP), но и их типы:

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

Конечно, это далеко не весь набор строковых функций, которые нам предоставили разработчики PHP, но я, исходя из своей практики, привёл Вам список самых часто используемых строковых функций в PHP.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 17 ):

    Здравствуйте, Михаил. Подскажите пожалуйста по поводу последнего примера, почему не работает такой пример: $str = «This is my string»; if (strpos($str, «Th») === true) echo «Строка найдена»; else echo «Строка не найдена»;

    Потому что strpos возвращает число, а если ничего не найдено, то false.

    Не поняла пример со смещением. Как его задать и при чем здесь 4?

    Смещение на x «переносит» начало строки для функции (но не в реальности), поиск будет начинаться не с 0-го, а с х-го символа

    Здравствуйте, Михаил! Функция echo «chr($i)» при $i = от 128 до 255 выводит вопросики�. Кодировка всех файлов UTF-8. Запускаю через денвер. В вашем же уроке аналогичная программа выводит русские буквы. Что можно сделать, чтобы вывести русские буквы? Спасибо!

    Нашел одно объяснение: я использую файл .htaccess в корне, а в нем строка AddDefaultCharset utf-8. Если удалить файл, то chr() выводит русские символы, но вся остальная кириллица на странице превращается в кракозябры. Но, как сделать так, чтобы работало и то и другое.

    Похоже, нашел решение — chr() выдает результат в своей кодировке. Необходимо просто перевести в UTF. Функция такая iconv(‘windows-1251′,’utf-8’,chr($i)). Михаил, может стоит добавить в уроки PHP хотя бы пару слов про кодировку строк.

    Уважаемый Александр,по возможности,добавит P.s. что у вас за интересная ава?) зачем оба флага и оба герба?)

    Михаил привет. $menu = $this->menu2->getAll(); Хочу чтоб цифра 2 менялась в зависимости от входного параметра. $menu = $this->menu.$sr_duble->getAll(); Но подобная конструкция не работает. Можно здесь что то придумать?

    Что означает такая конструкция? Метод на константу?

    Здравствуйте Михаил, разве функция strlen() возвращает кол.символов в строке, в справочнике по php написано что то байтовая функция и возвращает она количество байтов в строке, то есть она считает пробелы за символ.

    в PHP strlen() возвращает длину строки

    Функция strlen() возвратит количество байт, а не число символов в строке. P.s.В справочнике написано!

    вау-вау,в каком таком интересном справочнике это написано?если не секрет,конечно и это не заговор инопланетян. Можно ссылочку?) Быть может,Вы не верно уловили суть. Да,данная функция учитывает и пробелы как символ. Но опять же,она считает длину конкретной,заданной строки.Т.е.количество символов в этой строке. И да,пробел — это литера,не имеющая очертаний,т.е. невидимая А возвращает оно именно количество символов в строке. Можете проверить)

    ну,тут зависимость идёт В зависимости от кодировки. Но называют именно функцией для расчёта длинны строки. Просто не всегда размер символа соответствует одному байту. И если взять другую кодировку,то да. Но это не ошибка. Хотя подмечено верно Суть не меняется от этого замечания. Да и в любом случае у Михаила просто не написано уточнение о том,что только в случае,если символы весят не более байта

    Доброго времени! Мне нужна строковая функция чтобы в строке: 1. пробел(ов) заменить одним знаком «-» 2. изменить регистр в нижний, 3. удалить все знаки кроме букв и цифр. 4. и заменить все буквы на английский Если можете помогите кто нибудь пожалуйста.

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Обработка строк в РНР

    Одной из наиболее часто встречающихся задач в программировании является обработка символьных последовательностей. Если проще — строк. Как это делается на языке гипертекстового препроцессора РНР, и есть тема этой статьи.

    Откуда и как можно получить символьную последовательность? В самом простом случае — присвоить ее нужной переменной. Другие варианты — получить из формы или из файла. Если Вы присваиваете переменной нужное значение, то оно, как правило, не нуждается в обработке, так как программист делает присвоение в коде программы и, конечно, в нужном виде. Но если строка считывается из файла или получается посредством формы, она (символьная строка) нуждается в обработке.
    Самое первое, что стоит сделать, это удалить повторяющиеся пробелы. Для этого в РНР есть специальная функция: chop(str); Пример ее записи:


    В результате, обработанное значение строки $str не будет содержать повторяющихся пробелов. Если нужно убедиться в том, что строка не содержит пробелов в начале и в конце, применяется функция trim(str); ($str = trim ($str);). Когда требуется удалить пробелы только с начала строки, нужно использовать ltrim. И если уж зашла речь о начале строки, давайте убедимся, что первый символ заглавный. Чтобы сделать его таковым, примените ucfirst(str);. Есть и функция для перевода во всех словах в строке их первых букв в заглавные — ucwords(str);. Кроме того, очень часто бывает необходимо сравнить строку с некоторым шаблоном. Частный случай — поиск в строке (о нем несколько позже). Но нет никакой гарантии, что полученная строка введена пользователем или получена из файла в соответствии с правилами правописания. Другими словами — строка может содержать в середине слова или предложения чередующиеся заглавные и прописные символы. Решение данной проблемы — в применении функций strtolower(str); и strtoupper(st);. Эти функции, соответственно, переводят символьные строки в нижний и верхний регистр. Комбинирование данных возможностей языка РНР приводит к корректному построению строки не зависимо от того, как она была введена или получена в начальном виде.
    Еще одна необходимая вещь при работе со строками — их обрезка. Часто она применяется при обработке форм для ввода данных. Представьте, что кто-нибудь из Ваших «доброжелателей» введет в Вашу гостевую книгу текст этой статьи. Представляете, что получится? Вот для этого и нужно ограничить количество вводимых символов в любом поле формы. Тем более что делается это очень просто. Для начала нужно прописать ограничение в самой форме:

    Теперь форма с именем form ограничена в количестве вводимых символов числом 100. Но это еще далеко не все. Дело в том, что обойти такое ограничение очень просто, и нужно оно скорее для того, чтобы показать посетителю предел ограничения. Дальше нужно воспользоваться функцией РНР $form =substr($form, 0, 99);. Этим вы просто отрезаете часть полученной строки, превышающую 100 символов (стоит цифра 99, так как счет символов начинается с нуля). Теперь все потуги Ваших знакомых завалить Вас информацией будут тщетны, так как Ваш умный скрипт не пропустит больше определенного Вами количества символов.
    Собственно говоря, у функции substr(string, start, length); совсем другое предназначение. Она возвращает часть строки string, определяемую параметрами start (начало) и length (длина). Если параметр start положительный, то возвращаемая строка будет начинаться с start-ого символа строки string.
    Примеры:

    $form = substr(«abcdef», 1); // вернет «bcdef»
    $form = substr(«abcdef», 1, 3); // вернет «bcd»

    Если параметр start отрицательный, то возвращаемая строка будет начинаться start-ого символа от конца строки string. Примеры:

    $rest = substr(«abcdef», -1); // вернет «f»
    $rest = substr(«abcdef», -2); // вернет «ef»
    $rest = substr(«abcdef», -3, 1); // вернет «d»

    Если параметр length указан и он положительный, то возвращаемая строка закончится за length символов от начала start. Это приведет к строке с отрицательной длиной (потому что начало будет за концом строки), поэтому возвращаемая строка будет содержать один символ от начала строки start. Если length указан и он отрицательный, то возвращаемая строка закончится за length от конца строки string. Это опять приведет к строке с отрицательной длиной, поэтому возвращаемая строка будет содержать один символ от начала строки start. Примеры:

    $rest = substr(«abcdef», -1, -1); // вернет «bcde»

    Вот такая полезная функция. Кроме нее, при обработке данных формы очень важно уметь вырезать из полученной строки лишние или просто недопустимые символы. Можно в этом случае применить специальную функцию, которая заменяет все вхождения строки needle в строке haystack на указанную строку str. Эта функция записывается так: str_replace(needle, str, haystack);. Если вам не требуются причудливые правила замены, то следует всегда использовать эту функцию вместо ereg_replace(). Примеры:

    $str = str_replace(«», «n», $str); // вырезается символ ввода.
    $str = str_replace(«red», «black», $str); // в строке черный цвет будет заменен на красный.

    Следующая важная и полезная функция — нахождение длины строки. Синтаксис — strlen(string str); Пример:

    В переменной $a будет число 6, так как длина строки — 6 символов. Еще одна интересная возможность языка РНР — перевод текста (а значит — и символьных строк) из одной кодировки в другую. Это очень полезно, если нужно согласовать кодировки, например, сайта и почтовой программы. Причем поддерживаются самые распространенные русские кодировки: string convert_cyr_string(str, from, to);. Аргументы from и to являются одним символом, который определяет исходную и целевую кодовую таблицу. Поддерживаемые типы:

    k — koi8-r
    w — windows-1251
    i — iso8859-5
    a — x-cp866
    d — x-cp866
    m — x-mac-cyrillic

    Htmlspecialchars — переводит специальные символы в коды HTML. Htmlspecialchars(string); Определенные символы имеют особое значение в HTML и должны быть заменены кодами HTML, если таковые имеют. Эта функция возвращает строки с произведенными такими изменениями. Функция полезна для отчистки полученного от пользователя текста от разметки HTML (доски сообщений, гостевые книги). Осуществляются следующие замены:

    ‘&’ (амперсант) становится ‘&’
    ‘»‘ (двойные кавычки) становится ‘»‘
    ‘ ‘ (знак больше) становится ‘>’

    Следует отметить, что эта функция не заменяет ничего, кроме указанного выше. Для полной обработки применяют функцию htmlentities(). Она переводит все возможные символы в коды HTML. Htmlentities(string); Эта функция идентична htmlspecialchars(), кроме того, что все символы, которые имеют соответствующий код HTML, заменяются на этот HTML код. В настоящее время применяется кодовая таблица ISO-8859-1.
    Отдельно следует рассмотреть функции поиска в строке. Strchr — находит первое появление символа. strchr(haystack, needle); Эта функция является псевдонимом для функции strstr() и полностью ей идентична. Возвращает все haystack с первого появления строки needle и до конца. Если параметр needle не найден, то возвращается false. Если параметр needle не является строкой, то он переводится в целое число и рассматривается как числовое значение символа. Strrpos — находит позицию последнего появления символа в строке. Strrpos(haystack, needle); Возвращает номер позиции последнего появления символа needle в строке haystack. Следует отметить, что needle в этом случае может быть только единственным символом. Если в качестве параметра needle указывается строка, то только первый символ будет использован. Если needle не найден, то возвращается false. Если параметр needle не является строкой, то он переводится в десятичное число и рассматривается как числовое значение символа. Strrchr — находит последнее появление символа в строке. Strrchr(haystack, needle); Эта функция возвращает позицию haystack, с которой начинается последнее появление needle и продолжается до конца haystack. Возвращает false, если needle не найдена. Если параметр needle содержит более чем один символ, то используется первый символ. Если параметр needle не является строкой, то он переводится в целое число и рассматривается как числовое значение символа.

    // получение всего после последней новой строки
    $text = «Line 1nLine 2nLine 3»;
    $last = substr(strrchr($text, 10), 1);
    // Strtok — разбивает строку. strtok(arg1, arg2); Используется для
    // разбиения строки. Это значит, что если вы имеете строку типа «Как хорошо
    // программировать», то вы можете разбить ее на отдельные слова,
    // используя пробел в качестве разделителя.
    $string = » Как хорошо программировать «;
    $tok = strtok($string,» «);
    while($tok) < echo "Word=$tok
    «; $tok = strtok(» «); >

    Следует отметить, что только первый вызов функции strtok использует строковый аргумент. Для каждого последующего вызова функции strtok необходим только разделитель, так как это позволяет контролировать положение в текущей строке. Для начала заново или для разбития новой строки вам необходимо просто вызвать strtok с параметром строки опять для ее инициализации. Вы можете вставлять несколько разделителей в параметр разделителя. Строка будет разделяться при обнаружении любого из указанных символов. Также будьте внимательны к разделителям равным «0». Это может вызвать ошибку в определенных выражениях.
    Вот то, что понадобится Вам для работы со строками в первую очередь. Тут приведен далеко не полный перечень всех строковых функций. Рассмотрены только самые основные.

    Функции работы со строками в PHP

    Основные в php строковые функции необходимо знать любому веб-программисту, так как строка в РНР — это самый главный тип данных. Длина строки практически ничем не ограничена (разве что размером памяти, занимаемым сценарием и физическим остатком ресурсов компьютера), поэтому в строку можно прочитать файл среднего размера и обработать его. Также к строке можно привести любой объект с помощью функции serialize().

    Основные строковые функции PHP

    Перечень полезных строковых функций PHP удобнее всего представить в виде таблицы. Функции приводятся без параметров — просто название функции и ее краткое описание. Далее мы рассмотрим некоторые из этих функций отдельно.

    Обработка строк в рнр

    Частная коллекция качественных материалов для тех, кто делает сайты

    • Фотошоп-мастер2000+ уроков по фотошопу
    • Фото-монстр300+ уроков для фотографов
    • Видео-смайл200+ уроков по видеообработке
    • Жизнь в стиле «Кайдзен» Техники и приемы для гармоничной и сбалансированной жизни

    В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.

    Фильтрация данных с помощью zend-filter

    Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

    Контекстное экранирование с помощью zend-escaper

    Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

    Подключение Zend модулей к Expressive

    Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

    Совет: отправка информации в Google Analytics через API

    Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

    Подборка PHP песочниц

    Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

    Совет: активация отображения всех ошибок в PHP

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

    Агент

    PHP парсер юзер агента с поддержкой Laravel, работающий на базе библиотеки Mobile Detect.

    Обработка строк в рнр

    Обработка строк в РНР

    Одной из наиболее часто встречающихся задач в программировании является обработка символьных последовательностей. Если проще — строк. Как это делается на языке гипертекстового препроцессора РНР и есть тема этой статьи.

    Откуда и как можно получить символьную последовательность? В самом простом случае — присвоить ее нужной переменной. Другие варианты — получить из формы или из файла. Если Вы присваиваете переменной нужное значение, то оно, как правило, не нуждается в обработке, так как программист делает присвоение в коде программы, и конечно, в нужном виде. Но если строка считывается из файла, или получается посредством формы, она (символьная строка) нуждается в обработке.

    Самое первое, что стоит сделать, это удалить повторяющиеся пробелы. Для этого в РНР есть специальная функция: chop(str); Пример ее записи:

    $str = chop ($str);

    В результате, обработанное значение строки $str не будет содержать повторяющихся пробелов. Если нужно убедиться в том, что строка не содержит пробелов в начале и в конце, применяется функция trim(str); ( $str = trim ($str); ). Когда требуется удалить пробелы только с начала строки, нужно использовать ltrim. И если уж зашла речь о начале строки, давайте убедимся, что первый символ заглавный. Что бы сделать его таковым, примените ucfirst(str); Есть и функция для перевода во всех словах в строке их первых букв в заглавные — ucwords(str);. Кроме того, очень часто бывает необходимо сравнить строку с некоторым шаблоном. Частный случай — поиск в строке (о нем несколько позже). Но нет никакой гарантии, что полученная строка введена пользователем или получена из файла в соответствии с правилами правописания. Другими словами — строка может содержать в середине слова или предложения чередующиеся заглавные и прописные символы. Решение данной проблемы — в применении функций strtolower(str); и strtoupper(st);. Эти функции, соответственно, переводят символьные строки в нижний и верхний регистр. Комбинирование данных возможностей языка РНР приводит к корректному построению строки не зависимо от того, как она была введена или получена в начальном виде.

    Еще одна необходимая вещь при работе со строками — их обрезка. Часто она применяется при обработке форм для ввода данных. Представьте, что кто-нибудь из Ваших «доброжелателей» введет в Вашу гостевую книгу текст этой статьи. Представляете, что получится? Вот для этого и нужно ограничить количество вводимых символов в любом поле формы. Тем более что делается это очень просто. Для начала, нужно прописать ограничение в самой форме:

    Теперь форма с именем form ограничена в количестве вводимых символов числом 100. Но это еще далеко не все. Дело в том, что обойти такое ограничение очень просто, и нужно оно скорее для того, что бы показать посетителю предел ограничения. Дальше нужно воспользоваться функцией РНР $form =substr($form,0,99);. Этим вы просто отрезаете часть полученной строки, превышающую 100 символов (стоит цифра 99, так как счет символов начинается с нуля). Теперь все потуги Ваших знакомых завалить Вас информацией будут тщетны, так как Ваш умный скрипт не пропустит больше определенного Вами количества символов.

    Собственно говоря, у функции substr(string, start, length); совсем другое предназначение. Она возвращает часть строки string, определяемую параметрами start (начало) и length (длина). Если параметр start положительный, то возвращаемая строка будет начинаться с start-ого символа строки string. Примеры:

    $form = substr(«abcdef», 1); // вернет «bcdef»
    $form = substr(«abcdef», 1, 3); // вернет «bcd»

    Если параметр start отрицательный, то возвращаемая строка будет начинаться start-ого символа от конца строки string. Примеры:

    $rest = substr(«abcdef», -1); // вернет «f»
    $rest = substr(«abcdef», -2); // вернет «ef»
    $rest = substr(«abcdef», -3, 1); // вернет «d»

    Если параметр length указан и он положительный, то возвращаемая строка закончится за length символов от начала start. Это приведет к строке с отрицательной длиной (потому что начало будет за концом строки), поэтому возвращаемая строка будет содержать один символ от начала строки start. Если length указан и он отрицательный, то возвращаемая строка закончится за length от конца строки string. Это опять приведет к строке с отрицательной длиной, поэтому возвращаемая строка будет содержать один символ от начала строки start. Примеры:

    $rest = substr(«abcdef», -1, -1); // вернет «bcde»

    Вот такая полезная функция. Кроме нее, при обработке данных формы очень важно уметь вырезать из полученной строки лишние или просто недопустимые символы. Можно в этом случае применить специальную функцию, которая заменяет все вхождения строки needle в строке haystack на указанную строку str. Эта функция записывается так: str_replace(needle, str, haystack);. Если вам не требуются причудливые правила замены, то вам следует всегда использовать эту функцию вместо ereg_replace(). Примеры:

    $str = str_replace(«», «\n», $str); // вырезается символ ввода.
    $str = str_replace(«red», «black», $str); // в строке черный цвет будет заменен на красный.

    Следующая важная и полезная функция — нахождение длинны строки. Синтаксис — strlen(string str);Пример — $a = strlen(«qwerty»);. В переменной $a будет число 6, так как длинна строки — 6 символов. Еще одна интересная возможность языка РНР — перевод текста (а значит — и символьных строк) из одной кодировки в другую. Это очень полезно, если нужно согласовать кодировки, например, сайта и почтовой программы. Причем поддерживаются самые распространенные русские кодировки: string convert_cyr_string(str, from, to);. Аргументы from и to являются одним символом, который определяет исходную и целевую кодовую таблицу. Поддерживаемые типы:

    • k — koi8-r
    • w — windows-1251
    • i — iso8859-5
    • a — x-cp866
    • d — x-cp866
    • m — x-mac-cyrillic

    Htmlspecialchars — переводит специальные символы в коды HTML. Htmlspecialchars( string); Определенные символы имеют особое значение в HTML и должны быть заменены кодами HTML, если они таковые имеют. Эта функция возвращает строки с произведенными такими изменениями. Функция полезна для отчистки полученного от пользователя текста от разметки HTML (доски сообщений, гостевые книги). Осуществляются следующие замены:

    • ‘&’ (амперсанд) становится ‘&’
    • ‘»‘ (двойные кавычки) становится ‘»‘
    • ‘ ‘ (знак больше) становится ‘>’

    Следует отметить, что эта функция не заменяет ничего, кроме указанного выше. Для полной обработки применяют функцию htmlentities(). Она переводит все возможные символы в коды HTML. Htmlentities(string); Эта функция идентична htmlspecialchars() , кроме того, что все символы, которые имеют соответствующий код HTML, заменяются на этот HTML код. В настоящее время применяется кодовая таблица ISO-8859-1.

    Отдельно следует рассмотреть функции поиска в строке. Strchr — Находит первое появление символа. strchr(haystack, needle); Эта функция является псевдонимом для функции strstr(), и полностью ей идентична. Возвращает все haystack с первого появления строки needle и до конца. Если параметр needle не найден, то возвращается false. Если параметр needle не является строкой, то он переводится в целое число и рассматривается как числовое значение символа. Strrpos — Находит позицию последнего появления символа в строке. Strrpos(haystack, needle); Возвращает номер позиции последнего появления символа needle в строке haystack. Следует отметить, что needle в этом случае может быть только единственным символом. Если в качестве параметра needle указывается строка, то только первый символ будет использован. Если needle не найден, то возвращается false. Если параметр needle не является строкой, то он переводится в десятичное число и рассматривается как числовое значение символа. Strrchr — Находит последнее появление символа в строке.

    Эта функция возвращает позицию haystack, с которой начинается последнее появление needle и продолжается до конца haystack. Возвращает false если needle не найдена. Если параметр needle содержит более чем один символ, то используется первый символ. Если параметр needle не является строкой, то он переводится в целое число и рассматривается как числовое значение символа. Пример:

    // получение всего после последней новой строки
    $text = «Line 1\nLine 2\nLine 3»;
    $last = substr( strrchr( $text, 10 ), 1 );

    Strtok — разбивает строку. strtok( arg1, arg2); Используется для разбиения строки. Это значит, что если вы имеете строку типа «Как хорошо программировать», то вы можете разбить эту строку на отдельные слова, используя пробел в качестве разделителя.

    $string = » Как хорошо программировать «;
    $tok = strtok($string,» «);
    while($tok) < echo "Word=$tok
    «; $tok = strtok(» «); >

    Следует отметить, что только первый вызов функции strtok использует строковый аргумент. Для каждого последующего вызова функции strtok необходим только разделитель, так как это позволяет контролировать положение в текущей строке. Для начала заново или для разбития новой строки вам необходимо просто вызвать strtok с параметром строки опять для ее инициализации. Вы можете вставлять несколько разделителей в параметр разделителя. Строка будет разделяться при обнаружении любого из указанных символов. Также будьте внимательны к разделителям равным «0». Это может вызвать ошибку в определенных выражениях.

    PHP: Строки

    Значениями типа string являются текстовые строки (кратко строки). Строка — это последовательность из нуля или более символов. Символы включают в себя буквы, цифры, знаки пунктуации, специальные символы и пробелы.

    Строка может быть определена четырьмя различными способами:

    • двойными кавычками
    • одинарными кавычками
    • heredoc-синтаксисом
    • nowdoc-синтаксисом

    Строка в двойных кавычках

    Строка в двойных кавычках:

    В строках с двойными кавычками можно использовать управляющие последовательности. Управляющая последовательность — это специальные символы предназначенные для форматирования текстового вывода. В PHP доступны следующие управляющие последовательности:

    Последовательность Значение
    \n Перевод на новую строку (шестнадцатеричный код 0A).
    \t Горизонтальная табуляция (шестнадцатеричный код 09).
    \\ Обратная косая черта (обратный слэш).
    \$ Знак доллара.
    Двойная кавычка.
    \xXX Символ, заданный одной или двумя шестнадцатеричными цифрами.

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

    Строки, заключённые в двойные кавычки, могут содержать символы одинарных кавычек:

    Строка в одинарных кавычках (апострофах)

    Строка в одинарных кавычках:

    В отличие от строк в двойных кавычках и heredoc-синтаксиса, переменные и управляющие последовательности (за одним исключением), заключённые в одинарные кавычки, не обрабатываются. Это означает, что они будут интерпретированы как обычные символы строки:

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

    Строки, заключённые в одинарные кавычки, могут содержать символы двойных кавычек:

    Heredoc-синтаксис

    Heredoc-синтаксис — это альтернативный способ записи строк.

    Строка, определяемая с помощью Heredoc-синтаксиса, работает также, как и строка, расположенная в двойных кавычках. Разница между Heredoc и строкой в двойных кавычках заключается в том, что используя Heredoc нет необходимости экранировать двойные кавычки.

    Heredoc-синтаксис начинается с трёх символов , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Сразу после идентификатора должен следовать перевод на новую строку, никаких других символов кроме перевода на новую строку после идентификатора не должно быть, иначе возникнет ошибка. Далее идёт непосредственно строковое содержимое. После строкового содержимого, на отдельной строке, должен быть указан закрывающий идентификатор (тот же, что и после ). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

    Nowdoc-синтаксис

    Nowdoc-синтаксис также как и Heredoc является альтернативным способом записи строк.

    Строка, определяемая с помощью Nowdoc-синтаксиса, работает также, как и строка, расположенная в одинарных кавычках. Разница между Nowdoc и строкой в одинарных кавычках заключается в том, что используя Nowdoc нет необходимости экранировать одинарные кавычки.

    Синтаксис Nowdoc похож на Heredoc с той лишь разницей, что открывающий идентификатор обязательно должен быть заключён в одинарные кавычки:

    Обработка переменных в строках

    Существует два типа синтаксиса обработки переменных в строках: простой и сложный.

    Простой синтаксис — это когда имя переменной указывается в строке как есть.

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

    Сложный синтаксис — это когда имя переменной заключается в фигурные скобки.

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

    В данном случае не будет достигнут желаемый результат, поскольку интерпретатор будет считать $sport1 как часть имени переменной $sport1бол , которой не существует.

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

    Знак доллара может быть расположен как перед фигурной скобкой, так и после неё:

    Конкатенация

    Конкатенация — это объединение двух или более строк в одну большую. Объединение происходит с помощью оператора конкатенации — . (точка). При конкатенации каждая последующая строка добавляется в конец предыдущей:

    Значение любого типа, которое объединяется со строкой, будет неявно преобразовано в строку и далее будет произведена конкатенация:

    PHP: работа со строками. Строковые функции PHP

    Сайты можно разделить на статические и динамические. После освоения HTML и CSS, которые позволяют сделать красивую визитку в интернете, многие задумываются, как создать динамический сайт на PHP. При этом верстальщик должен учитывать, что теперь он начинает изучать веб-программирование: принципы работы с сайтом будут отличаться. Одна из первых проблем, с которой сталкивается начинающий в PHP — работа со строками, их чтение и обработка.

    Создание и вывод строки

    Мы разберем вывод строки на экран с помощью известной всем языковой конструкции echo. Программист может вывести строку сразу:

    echo «Это Новая Строка»

    или сначала создать переменную, а затем вывести ее на экран:

    $str = «Это Новая Строка»;

    Если нужно вывести несколько строк в одной, то прибегают к их конкатенации:

    echo «Это» . » Новая» . » Строка»;

    echo $str1 . $str2 . $str3;

    В последнем случае на экран будет выведено ЭтоНоваяСтрока. Пробел можно добавить сразу при вызове echo:

    echo $str1 . ‘ ‘ . $str2 . ‘ ‘ . $str3;

    В этом случае на экран выведется: «Это Новая Строка». Конкатенация возможна не только при выводе, но и при создании строки:

    $string = $str1 . ‘ ‘ . $str2 . ‘ ‘ . $str3;

    Echo выводит как латинские буквы, так и кириллические. Если одна из переменных содержала число, то при конкатенации это число будет преобразовано в соответствующую строку:

    $sum = $i + $i; //теперь $sum содержит число 4

    echo $i . » + » . $i . » = » . $sum;

    На экран будет выведено: «2 + 2 = 4».

    Служебные символы

    Допустим, строка определена с помощью двойных кавычек ($string = «Вот так»). Тогда можно совершенно спокойно использовать управляющие последовательности:

    • \n совершает перевод строки;
    • \r возвращает каретку;
    • \» экранирует двойные кавычки:
      • echo «Строка с \»двойными\» кавычками»; //Строка с «двойными» кавычками
    • \$ экранирует доллар;
    • \\ экранирует обратную косую черту.

    Последовательностей гораздо больше, все их найти можно в официальной документации PHP.

    Как найти позицию первого вхождения подстроки

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

    $string = «My name is Yemelyan and I am 27 year old»;

    Также у нас есть две строки с именами:

    Нам необходимо узнать, содержит ли первая строка эти два имени. Для этого используется функция strpos($str, $search). Она возвращает позицию искомой подстроки $search, если эта строка содержится в исходной, $str. В противном случае функция возвращает булево значение false. Например, strpos($string, $anotherName) вернет false, а strpos($string, $name) — целое число. Код будет таким (напишем вариант, когда позиция выводится на экран):

    $string = «My name is Yemelyan and I am 27 year old»;

    echo strpos($string, $anotherName); //выведет false

    echo strpos($string, $name); //выведет позицию первого вхождения подстроки

    Учтите, что нумерация строки начинается с нуля, то есть в нашем случае последняя строка выведет число 11 (пробелы также считаются).

    Поиск позиции последнего вхождения подстроки и подводные камни

    Если функция strpos() возвращает позицию первого вхождения, то обратная ей функция strrpos() ищет последнее вхождение подстроки.

    Здесь есть некоторые подводные камни, связанные с началом нумерации. Это стоит учитывать: в PHP работа со строками может быть осложнена ограничениями в сравнениях. Так, лучше не использовать операцию сравнения с отрицанием: strpos($str, $search)!=false. В любой версии PHP примеры с подобной эквиваленцией могут работать неправильно, ведь нумерация строк начинается с нуля, а в логической интерпретации 0 и есть false. Это распространяется и на функцию strrpos().

    Как найти число вхождений подстроки

    Часто нужно найти не позицию первого или последнего вхождения подстроки в строку, а общее их число. Для этого используется функция substr_count(), которая обрабатывает по меньшей мере две переменные: substr_count($str, $search). Возвращает целое число. Если необходимо уменьшить область поиска по строке, то в функцию передаются еще две переменные: начало и конец строки соответственно. То есть функция в этом случае вызывается так: substr_count($str, $search, $start, $end). Функция будет искать подстроку $search на промежутке от $start до $end исходной строки $str. Если строка не будет найдена, то функция вернет ноль.

    Как изменить регистр строки в PHP: примеры

    Изменение регистра часто используется для сравнения строк и условных операторов. Допустим, пользователь должен ввести имя верховного бога в скандинавской мифологии. В программе есть вариант «Один», с которым и будет сравниваться ответ пользователя. Если введенный текст не будет совпадать с имеющимся (например, пользователь напишет «один» или «ОДИН»), то программа вернет значение false вместо true. Чтобы этого избежать, применяется функция изменения регистра. Это часто используется, если сайт на PHP имеет теги: вместо сотни вариантов слова «личное» («Личное», «личное», «ЛИЧНОЕ» и т. п.) есть только один тег в нижнем регистре.

    Функция strtolower() изменяет регистр на нижний. Допустим, есть строка $catName = «Fluffy». Функция strtolower($catName) вернет строку «fluffy». Изменить регистр на верхний можно с помощью функции strtoupper().

    Как найти длину строки в PHP: работа с функциями

    Часто требуется найти длину строки. Например, в PHP работа со строками такого рода может понадобиться в создании цикла. Для поиска строки используется функция strlen(), которая возвращает число — количество символов. Нельзя забывать, что последний символ будет иметь номер strlen($str)-1, так как нумерация начинается с нуля.

    Получение и замена подстроки в PHP: работа со строками

    Получение подстроки осуществляется функцией substr(), которая может принимать два или три аргумента: substr($str, $start, $end). Допустим, у нас есть строка $string = «Fluffy cat», и мы хотим получить подстроку со второго по четвертый символ. Так как нумерация начинается с нуля, то переменная с этой подстрокой будет выглядеть так: $newString = substr($string, 1, 4). Если же мы введем $newString = substr($string, 1), то получим подстроку со второго символа по последний (то есть «luffy»). Этот код идентичен полному коду строки с использованием strlen(): substr($string, 1, strlen($string)).

    Для замены подстроки используется функция str_replace(), которая принимает три переменные: str_replace($subStr, $newSub, $str). В отличие от многих функций, str_replace() корректно работает с кириллическими символами и не имеет аналога с префиксом. Пример:

    $str = «Сегодня ужасная погода!»;

    $newStr = str_replace(«ужасная», «чудесная», $str); //Сегодня чудесная погода!

    Перевод строки в число

    Для использования как intval(), так и floatval() необходимо, чтобы строка начиналась с цифр, они и будут преобразованы в число. Если после цифр будет идти любой набор букв, они просто проигнорируются. В том случае, если строка начинается с букв, использование функции вернет ноль. В идеале же строка должна содержать в себе исключительно цифры.

    Перевод числа в строку

    Часто требуется перевести числа в строку. Скажем, если необходимо взять половинку числа и возвести ее в квадрат (например, проверить, выполняется ли равенство: 88 х 88 + 33 х 33 = 8833). В этом случае используется функция strval(), которая возвращает строку с числом. После этого с новой строкой можно совершать все прочие действия: изменять, искать вхождение подстроки и другие функции. При необходимости строку можно вновь перевести в число уже описанным выше способом.

    Илон Маск рекомендует:  Sun microsystems и современные технологии сетевых вычислений
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL