Обработка строк в РНР
Андрей Кухарчик
Одной из наиболее часто встречающихся задач в программировании является обработка символьных последовательностей. Если проще – строк. Как это делается на языке гипертекстового препроцессора РНР и есть тема этой статьи.
Откуда и как можно получить символьную последовательность? В самом простом случае – присвоить ее нужной переменной. Другие варианты – получить из формы или из файла. Если Вы присваиваете переменной нужное значение, то оно, как правило, не нуждается в обработке, так как программист делает присвоение в коде программы, и конечно, в нужном виде. Но если строка считывается из файла, или получается посредством формы, она (символьная строка) нуждается в обработке.
Самое первое, что стоит сделать, это удалить повторяющиеся пробелы. Для этого в РНР есть специальная функция: chop(str); Пример ее записи:
$str= chop ($str);
В результате, обработанное значение строки $str не будет содержать повторяющихся пробелов. Если нужно убедиться в том, что строка не содержит пробелов в начале и в конце, применяется функция trim(str); ( $str = trim ($str); ). Когда требуется удалить пробелы только с начала строки, нужно использовать ltrim. И если уж зашла речь о начале строки, давайте убедимся, что первый символ заглавный. Что бы сделать его таковым, примените ucfirst(str); Есть и функция для перевода во всех словах в строке их первых букв в заглавные - ucwords(str);. Кроме того, очень часто бывает необходимо сравнить строку с некоторым шаблоном. Частный случай – поиск в строке (о нем несколько позже). Но нет никакой гарантии, что полученная строка введена пользователем или получена из файла в соответствии с правилами правописания. Другими словами – строка может содержать в середине слова или предложения чередующиеся заглавные и прописные символы. Решение данной проблемы – в применении функций strtolower(str); и strtoupper(st);. Эти функции, соответственно, переводят символьные строки в нижний и верхний регистр. Комбинирование данных возможностей языка РНР приводит к корректному построению строки не зависимо от того, как она была введена или получена в начальном виде.
Еще одна необходимая вещь при работе со строками – их обрезка. Часто она применяется при обработке форм для ввода данных. Представьте, что кто-нибудь из Ваших <доброжелателей> введет в Вашу гостевую книгу текст этой статьи. Представляете, что получится? Вот для этого и нужно ограничить количество вводимых символов в любом поле формы. Тем более что делается это очень просто. Для начала, нужно прописать ограничение в самой форме:
<input maxlength="100" name="form">
Теперь форма с именем 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 -- Находит последнее появление символа в строке.
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". Это может вызвать ошибку в определенных выражениях.
Вот то, что понадобится Вам для работы со строками в первую очередь. Тут приведен далеко не полный перечень всех строковых функций. Рассмотрены только самые основные. За подробной информацией я отсылаю Вас к переводу руководства по РНР всероссийского клуба Web-мастеров, на основе данных которого и написана эта статья. Адрес в Интернете – http://www.webclub.ru/.
Список литературы
Для подготовки данной работы были использованы материалы с сайта http://www.realcoding.net/