На главную страницу
ОБ ИСПОЛЬЗОВАНИИ ФУНКЦИЙ ОБРАБОТКИ СТРОК в PHPОдной из наиболее часто встречающихся задач в программировании является обработка символьных последовательноcтей. Если строка считывается из файла или получается посредством формы, она (символьная строка) нуждается в обработке. Ниже приведены некоторые наиболее популярные функции обработки строк: • strstr — находит первое вхождение подстроки. stristr — Регистро-независимый вариант функции strstr. Пример strtr(): $email = 'user@example.com'; $domain = strstr($email, '@'); print $domain; // печатает @example.com substr_count — Возвращает число вхождений подстроки Пример substr_count(): print substr_count("This is a test", "is"); // выводит 2 • str_replace — Заменяет строку поиска на строку замены ($str = str_replace ($search, $replace, $subject, $count);). Регистронезависимый вариант этой функции: str_ireplace. Эта функция возвращает строку или массив subject, в котором все вхождения search заменены на replace. Если не нужны сложные правила поиска/замены, использование этой функции предпочтительнее ereg_replace() или preg_replace(). Примеры использования str_replace(): <?php $bodytag = str_replace("%body%", "black", ""); // $bodytag = $vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U"); $onlyconsonants = str_replace($vowels, "", "Hello World of PHP"); // $onlyconsonants = "Hll Wrld f PHP" $phrase = "You should eat fruits, vegetables, and fiber every day."; $healthy = array("fruits", "vegetables", "fiber"); $yummy = array("pizza", "beer", "ice cream"); $newphrase = str_replace($healthy, $yummy, $phrase); // $newphrase = "You should eat pizza, beer, and ice cream every day" $str = str_replace("ll", "", "good golly miss molly!", $count); echo $count; // выведет 2 ?> • strtr - Преобразует заданные символы ($str = strtr ($str, $from, $to);). Эта функция возвращает строку str, в которой каждое вхождение любого символа из перечисленных в $from заменено на соответствующий символ из строки $to. strtr() может вызываться с двумя аргументами. В этом случае $from должен быть массивом, индексы которого трактуются как строки поиска, а соответствующие значения - как строки замены. strtr() в первую очередь заменяет более длинные подстроки, причем одна и та же строка поиска используется только один раз. Пример использования strtr() с двумя аргументами: <?php $trans = array("hello" => "hi", "hi" => "hello"); echo strtr("hi all, I said hello", $trans); ?> Этот код выведет: hello all, I said hi • Если нужно убедиться в том, что строка не содержит пробелов в начале и в конце, применяется функция trim(str) ($str = trim ($str);). Когда требуется удалить пробелы только с начала строки, нужно использовать ltrim(), в конце строки rtrim(). И если уж зашла речь о начале строки, давайте убедимся, что первый символ заглавный. Чтобы сделать его таковым, примените ucfirst();. Есть и функция для перевода во всех словах в строке их первых букв в заглавные - ucwords();. Кроме того, очень часто бывает необходимо сравнить строку с некоторым шаблоном. Частный случай - поиск в строке (о нем несколько позже). Но нет никакой гарантии, что полученная строка введена пользователем или получена из файла в соответствии с правилами правописания. Другими словами - строка может содержать в середине слова или предложения чередующиеся заглавные и прописные символы. Решение данной проблемы - в применении функций strtolower(); и strtoupper();. Эти функции, соответственно, переводят символьные строки в нижний и верхний регистр. Комбинирование данных возможностей языка РНР приводит к корректному построению строки не зависимо от того, как она была введена или получена в начальном виде. • htmlspecialchars - переводит специальные символы в коды HTML ($str = htmlspecialchars($str);). Определенные символы имеют особое значение в HTML и должны быть заменены кодами HTML, если таковые имеют. Эта функция возвращает строки с произведенными такими изменениями. Функция полезна для отчистки полученного от пользователя текста от разметки HTML (доски сообщений, гостевые книги). Осуществляются следующие замены: '&' (амперсант) становится '&' '"' (двойные кавычки) становится '"' '<' (знак меньше) становится '<' '>' (знак больше) становится '>' Следует отметить, что эта функция не заменяет ничего, кроме указанного выше. Для полной обработки применяют функцию htmlentities(string); • htmlspecialchars_decode — Преобразует специальные HTML-коды обратно в соответствующие символы • stripslashes - Удаляет экранирование символов, произведенное функцией addslashes(). Пример использования addslashes(): <?php $str = "Is your name O'reilly?"; echo addslashes($str); // выводит: Is your name O\'reilly? ?> Пример использования stripslashes(): <?php $str = "Is your name O\'reilly?"; echo stripslashes($str); // выводит: Is your name O'reilly? ?> • quotemeta - закавычивает метасимволы. Возвращает версию строки str с символами backslash (\) перед каждым из следующих символов: . \\ + * ? [ ^ ] ( $ ) Пример использования строковых функций вместо регулярных выражений.В общем случае функции регулярных выражений выполняются менее эффективно, чем строковые функции с аналогичными возможностями. Если стоящая перед Вами задача достаточно проста, чтобы можно было использовать строковые функции, им и следует отдать предпочтение. Пример: Стоит задача отбросить из начала текстовой строки все символы, расположенные до строкового фрагмента STR1, и из конца этой же строки все символы расположенные после текстового фрагмента STR2. Казалось бы, такая задача легко решается с использованием функций обработки регулярных выражений explode(): function cheize($str1, $str2, $str) # Выбор подстроки по первым включениям (между str1 и str2) (Вариант 1) { $begin = explode($str1, $str); $end = explode($str2, $begin[1]); return $str = $end[0]; }; Но в некоторых случаях (например, при обработке текстовых файлов) такая функция будет работать очень медленно и не всегда корректно. Дело в том, что эта функция будет разбивать текст на элементы, образовывая массив по каждому вхождению фрагмента шаблонов поиска. Следовательно, шаблонный поиск по регулярному выражению (в нашем случае фрагменту строки) с использование массива утяжеляют функции. Но эту задачу легко решить с использованием строковых функций: function cheize($str1, $str2, $str) # Выбор подстроки по первым включениям (между str1 и str2) (Вариант 2) { return start_str($str2, end_str($str1, $str)); }; ,где используются еще две пользовательские функции: function start_str($str_pattern, $str) # Начало строки до первого вхождения образца (образец не входит) { if (($n = strpos($str, $str_pattern)) === false) {return $str;} else { return substr ($str, 0, $n); } }; function end_str($str_pattern, $str) # Конец строки после первого вхождения образца (образец не входит) { if (($n = strpos($str, $str_pattern)) === false) {return $str;} else { return substr($str, $n + strlen($str_pattern));} };
В приведенном примере мы используем стандартные строковые функции: • strpos() - находит в строке первый экземпляр заданной подстроки. Если подстрока не найдена, strpos( ) возвращает FALSE. Это свойство функции и вызвало использовать такую конструкцию оператора if в нашем примере. • substr() - возвращает часть строки, начинающуюся с заданной начальной позиции и имеющую заданную длину. • strlen() - возвращает длину строки. Казалось бы, какой смысл городить столько строковых функций вместо использования одной функции обработки регулярных выражений. Ответ на этот вопрос Вы найдете тогда, когда будите экспериментировать с разбором больших и сложных текстов. Преобразование HTML в простой текстИногда возникает необходимость преобразовать файл в формате HTML в простой текст. Функции, описанные ниже, помогут вам в решении этой задачи. • strip_tags() - удаляет из строки все теги HTML и РНР, оставляя в ней только текст. • get_meta_tags() - предназначена для поиска в файле HTML тегов МЕТА. Ниже приведен пример удаления из строки всех тегов HTML функцией strip_tags(): $user_input = "I just love РНР and gourment recipes!"; $stripped_input = strip_tags($user_input); Результат: // $stripped_input = "I just love PHP and gourmet recipes!"; В следующем примере удаляются не все, а лишь некоторые теги: $input = "I <b>love</b> to <a href=\"http://www.eating.com\">eat!</a>!"; $strip_input = strip_tags($user_input, "<a>"); Результат: // $strip_input = "I love to<a href=\"http://www.eating.com\">eat!</a>!"; Теги МЕТА содержат информацию о странице, используемую главным образом поисковыми системами. Эти теги находятся внутри пары тегов <head>...</head>. Применение тегов МЕТА и функции get_meta_tags() продемонстрировано в следующем фрагменте: <html> <head> <title>PHP Recipes</title> <meta name="keywords" content="gourmet. PHP, food. code, recipes, chef, programming, web"> <meta name="description" content="PHP Recipes provides savvy readers with the latest in PHP programming and gourmet cuisine!"> <meta name="author" content="WJ Gilmore"> </head> <? php $meta_tags = get_meta_tags("example.html"); ?> Результат работы функции get_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. • nl2br — Вставляет HTML код разрыва строки перед каждым переводом строки. Возвращает строку с '<br />', вставленными перед всеми символами перевода строки. |