На главную страницу

ОБ ИСПОЛЬЗОВАНИИ ФУНКЦИЙ ОБРАБОТКИ СТРОК в 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().


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

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

Пример 1.

Неправильно:

<? $new = ereg_replace("-","_",$str); ?>

Правильно:

<? $new = str_replace("-","_",$str); ?> 

Пример 2.

Неправильно:

<? preg_match("/(\..*?)$/",$str,$reg); ?> 

Правильно:

<? substr($str,strrpos($str,)); ?>

Пример 3.

Неправильно:

function ruslat ($string) # Функция перекодировки кириллицы в транслит.
{
$string = ereg_replace("ж","zh",$string);
$string = ereg_replace("ё","yo",$string);
$string = ereg_replace("й","i",$string);
$string = ereg_replace("ю","yu",$string);
$string = ereg_replace("ь","'",$string);
$string = ereg_replace("ч","ch",$string);
$string = ereg_replace("щ","sh",$string);
$string = ereg_replace("ц","c",$string);
$string = ereg_replace("у","u",$string);
$string = ereg_replace("к","k",$string);
$string = ereg_replace("е","e",$string);
$string = ereg_replace("н","n",$string);
$string = ereg_replace("г","g",$string);
$string = ereg_replace("ш","sh",$string);
$string = ereg_replace("з","z",$string);
$string = ereg_replace("х","h",$string);
$string = ereg_replace("ъ","''",$string);
$string = ereg_replace("ф","f",$string);
$string = ereg_replace("ы","y",$string);
$string = ereg_replace("в","v",$string);
$string = ereg_replace("а","a",$string);
$string = ereg_replace("п","p",$string);
$string = ereg_replace("р","r",$string);
$string = ereg_replace("о","o",$string);
$string = ereg_replace("л","l",$string);
$string = ereg_replace("д","d",$string);
$string = ereg_replace("э","yе",$string);
$string = ereg_replace("я","jа",$string);
$string = ereg_replace("с","s",$string);
$string = ereg_replace("м","m",$string);
$string = ereg_replace("и","i",$string);
$string = ereg_replace("т","t",$string);
$string = ereg_replace("б","b",$string);
$string = ereg_replace("Ё","yo",$string);
$string = ereg_replace("Й","I",$string);
$string = ereg_replace("Ю","YU",$string);
$string = ereg_replace("Ч","CH",$string);
$string = ereg_replace("Ь","'",$string);
$string = ereg_replace("Щ","SH'",$string);
$string = ereg_replace("Ц","C",$string);
$string = ereg_replace("У","U",$string);
$string = ereg_replace("К","K",$string);
$string = ereg_replace("Е","E",$string);
$string = ereg_replace("Н","N",$string);
$string = ereg_replace("Г","G",$string);
$string = ereg_replace("Ш","SH",$string);
$string = ereg_replace("З","Z",$string);
$string = ereg_replace("Х","H",$string);
$string = ereg_replace("Ъ","''",$string);
$string = ereg_replace("Ф","F",$string);
$string = ereg_replace("Ы","Y",$string);
$string = ereg_replace("В","V",$string);
$string = ereg_replace("А","A",$string);
$string = ereg_replace("П","P",$string);
$string = ereg_replace("Р","R",$string);
$string = ereg_replace("О","O",$string);
$string = ereg_replace("Л","L",$string);
$string = ereg_replace("Д","D",$string);
$string = ereg_replace("Ж","Zh",$string);
$string = ereg_replace("Э","Ye",$string);
$string = ereg_replace("Я","Ja",$string);
$string = ereg_replace("С","S",$string);
$string = ereg_replace("М","M",$string);
$string = ereg_replace("И","I",$string);
$string = ereg_replace("Т","T",$string);
$string = ereg_replace("Б","B",$string);
return $string;
}

Правильно:

function ruslat ($string) # Функция перекодировки кириллицы в транслит.
{
$trans = array(
'ж' => 'zh',
'ё' => 'yo',
'й' => 'i',
'ю' => 'yu',
'ь' => "'",
'ч' => 'ch',
'щ' => 'sh',
'ц' => 'c',
'у' => 'u',
'к' => 'k',
'е' => 'e',
'н' => 'n',
'г' => 'g',
'ш' => 'sh',
'з' => 'z',
'х' => 'h',
'ъ' => "''",
'ф' => 'f',
'ы' => 'y',
'в' => 'v',
'а' => 'a',
'п' => 'p',
'р' => 'r',
'о' => 'o',
'л' => 'l',
'д' => 'd',
'э' => 'yе',
'я' => 'jа',
'с' => 's',
'м' => 'm',
'и' => 'i',
'т' => 't',
'б' => 'b',
'Ё' => 'yo',
'Й' => 'I',
'Ю' => 'YU',
'Ч' => 'CH',
'Ь' => "'",
'Щ' => 'SH',
'Ц' => 'C',
'У' => 'U',
'К' => 'K',
'Е' => 'E',
'Н' => 'N',
'Г' => 'G',
'Ш' => 'SH',
'З' => 'Z',
'Х' => 'H',
'Ъ' => "''",
'Ф' => 'F',
'Ы' => 'Y',
'В' => 'V',
'А' => 'A',
'П' => 'P',
'Р' => 'R',
'О' => 'O',
'Л' => 'L',
'Д' => 'D',
'Ж' => 'Zh',
'Э' => 'Ye',
'Я' => 'Ja',
'С' => 'S',
'М' => 'M',
'И' => 'I',
'Т' => 'T',
'Б' => 'B');
return strtr($string, $trans);
}

Пример 4.

Функции перевода текста из кодировки windows-1251 в UTF-8 и обратно:

function win_urf8($str) # Функция перекодировки windows-1251 -> UTF-8
{
$win_urf8 = array(
'А' => '%D0%90','Б' => '%D0%91','В' => '%D0%92','Г' => '%D0%93',
'Д' => '%D0%94','Ж' => '%D0%96','З' => '%D0%97','Е' => '%D0%95',
'Ё' => '%D0%81','И' => '%D0%98','Й' => '%D0%99','К' => '%D0%9A',
'Л' => '%D0%9B','М' => '%D0%9C','Н' => '%D0%9D','О' => '%D0%9E',
'П' => '%D0%9F','Р' => '%D0%A0','С' => '%D0%A1','Т' => '%D0%A2',
'У' => '%D0%A3','Ф' => '%D0%A4','Х' => '%D0%A5','Ц' => '%D0%A6',
'Ч' => '%D0%A7','Ш' => '%D0%A8','Щ' => '%D0%A9','Ь' => '%D0%AC',
'Ы' => '%D0%AB','Ъ' => '%D0%AA','Э' => '%D0%AD','Ю' => '%D0%AE',
'Я' => '%D0%AF','а' => '%D0%B0','б' => '%D0%B1','в' => '%D0%B2',
'г' => '%D0%B3','д' => '%D0%B4','ж' => '%D0%B6','з' => '%D0%B7',
'е' => '%D0%B5','ё' => '%D1%91','и' => '%D0%B8','й' => '%D0%B9',
'к' => '%D0%BA','л' => '%D0%BB','м' => '%D0%BC','н' => '%D0%BD',
'о' => '%D0%BE','п' => '%D0%BF','р' => '%D1%80','с' => '%D1%81',
'т' => '%D1%82','у' => '%D1%83','ф' => '%D1%84','х' => '%D1%85',
'ц' => '%D1%86','ч' => '%D1%87','ш' => '%D1%88','щ' => '%D1%89',
'ь' => '%D1%8C','ы' => '%D1%8B','ъ' => '%D1%8A','э' => '%D1%8D',
'ю' => '%D1%8E','я' => '%D1%8F',' ' => '+');
return strtr($str, $win_urf8);
}

function utf8_win($s) # Функция перекодировки UTF-8 -> windows-1251
{
$s=strtr($s,array("\xD0\xB0"=>"а", "\xD0\x90"=>"А", "\xD0\xB1"=>"б", "\xD0\x91"=>"Б",
 "\xD0\xB2"=>"в", "\xD0\x92"=>"В", "\xD0\xB3"=>"г", "\xD0\x93"=>"Г", "\xD0\xB4"=>"д",
 "\xD0\x94"=>"Д", "\xD0\xB5"=>"е", "\xD0\x95"=>"Е", "\xD1\x91"=>"ё", "\xD0\x81"=>"Ё",
 "\xD0\xB6"=>"ж", "\xD0\x96"=>"Ж", "\xD0\xB7"=>"з", "\xD0\x97"=>"З", "\xD0\xB8"=>"и",
 "\xD0\x98"=>"И", "\xD0\xB9"=>"й", "\xD0\x99"=>"Й", "\xD0\xBA"=>"к", "\xD0\x9A"=>"К",
 "\xD0\xBB"=>"л", "\xD0\x9B"=>"Л", "\xD0\xBC"=>"м", "\xD0\x9C"=>"М", "\xD0\xBD"=>"н",
 "\xD0\x9D"=>"Н", "\xD0\xBE"=>"о", "\xD0\x9E"=>"О", "\xD0\xBF"=>"п", "\xD0\x9F"=>"П",
 "\xD1\x80"=>"р", "\xD0\xA0"=>"Р", "\xD1\x81"=>"с", "\xD0\xA1"=>"С", "\xD1\x82"=>"т",
 "\xD0\xA2"=>"Т", "\xD1\x83"=>"у", "\xD0\xA3"=>"У", "\xD1\x84"=>"ф", "\xD0\xA4"=>"Ф",
 "\xD1\x85"=>"х", "\xD0\xA5"=>"Х", "\xD1\x86"=>"ц", "\xD0\xA6"=>"Ц", "\xD1\x87"=>"ч",
 "\xD0\xA7"=>"Ч", "\xD1\x88"=>"ш", "\xD0\xA8"=>"Ш", "\xD1\x89"=>"щ", "\xD0\xA9"=>"Щ",
 "\xD1\x8A"=>"ъ", "\xD0\xAA"=>"Ъ", "\xD1\x8B"=>"ы", "\xD0\xAB"=>"Ы", "\xD1\x8C"=>"ь",
 "\xD0\xAC"=>"Ь", "\xD1\x8D"=>"э", "\xD0\xAD"=>"Э", "\xD1\x8E"=>"ю", "\xD0\xAE"=>"Ю",
 "\xD1\x8F"=>"я", "\xD0\xAF"=>"Я"));
return $s;
};

Пример 5.

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

Неправильно:

function print_user($filename,$list)
 {
	$fd = @fopen($filename, "w");
	@fwrite($fd, @implode("\r\n", $list)); // Запись списка в файл
	@fclose($fd);
 };

Правильно:

function print_user2($filename,$list)
 {
	$content = '';
	foreach($list as $word) 
	# Считываем список по элементно и формируем текстовую переменную
 	{
		$content .= trim($word)."\r\n";
 	};
	file_put_contents ($filename, $content); # Записываем файл
 };

Примеры использования 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 (доски сообщений, гостевые книги). Осуществляются следующие замены:

'&' (амперсант) становится '&amp;'

'"' (двойные кавычки) становится '&quot;'

'<' (знак меньше) становится '&lt;'

'>' (знак больше) становится '&gt;'

Следует отметить, что эта функция не заменяет ничего, кроме указанного выше. Для полной обработки применяют функцию 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));}
 };
Примеры вызова функций:Результат выполнения:
echo cheize("23", "78", "123456789");456
echo start_str("23", "12345678");1
echo end_str("34", "12345678");56789


В приведенном примере мы используем стандартные строковые функции:

• 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 />', вставленными перед всеми символами перевода строки.



В начало страницы
Hosted by uCoz