Разбор строки php. PHP: работа со строками. Строковые функции PHP. Обработка строковых данных без применения регулярных выражений

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

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

$str = "This is my string";
echo strlen($str);
?>

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

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

$str = "This is my string";
echo strtolower($str)."
";
echo strtoupper($str);
?>

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

$str = "This is my string";
echo substr($str, 1)."
";
echo substr($str, 4, 2)."
";
?>

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

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

$str = "This is my string";
echo str_replace("my", "your", $str);
?>

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

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

$str = "This is my string";
echo strpos($str, "is");
?>

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

$str = "This is my string";
echo strpos($str, "is", 4);
?>

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

$str = "This is my string";
if (strpos($str, "Th") == false) echo "Строка не найдена";
else echo "Строка найдена";
?>

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

$str = "This is my string";
if (strpos($str, "Th") === false) echo "Строка не найдена";
else echo "Строка найдена";
?>

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

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

Строки — очень важный тип данных, с которым приходится постоянно работать при решении задач веб разработки. В данной статье описаны 10 очень полезных приемов, которые сделают жизнь PHP разработчика легче.

Автоматическое удаление html тегов из строки

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

$text = strip_tags($input, "");

Получаем текст между $start и $end

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

Function GetBetween($content,$start,$end){ $r = explode($start, $content); if (isset($r)){ $r = explode($end, $r); return $r; } return ""; }

Трансформация URL в гиперссылку

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

$url = "Jean-Baptiste Jung (http://www.webdevcat.com)"; $url = preg_replace("#http://(+)#", " ", $url);

Разделяем текст в 140 символный массив для Twitter

Может быть вы знаете, что Twitter принимает сообщения длиной не более 140 символов. Если у вас есть планы организовать взаимодействие своего приложения с популярным социальным сайтом сообщений, то функция, которая обрезает сообщения до 140 символов, наверняка придётся вам ко двору.

Function split_to_chunks($to,$text){ $total_length = (140 - strlen($to)); $text_arr = explode(" ",$text); $i=0; $message=""; foreach ($text_arr as $word){ if (strlen($message[$i] . $word . " ") <= $total_length){ if ($text_arr == $word){ $message[$i] .= $word; } else { $message[$i] .= $word . " "; } } else { $i++; if ($text_arr == $word){ $message[$i] = $word; } else { $message[$i] = $word . " "; } } } return $message; }

Удаляем URL из строки

Многие люди оставляют в комментариях блога URL, чтобы получить трафик или организовать обратную связь. Такие ссылки загрязняют блог и могут стать причиной расстройств владельца в случае их большого количества. Так что следующая функция будет очень полезна!

$string = preg_replace("/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*/i", "", $string);

Конвертируем строку в слаг

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

Function slug($str){ $str = strtolower(trim($str)); $str = preg_replace("/[^a-z0-9-]/", "-", $str); $str = preg_replace("/-+/", "-", $str); return $str; }

Парсинг файла CSV

CSV (Coma separated values — значения, разделённые запятой) файлы — простой способ для хранения и передачи данных, а парсинг таких файлов в PHP выполняется чрезвычайно просто. Не верите? Следующий код демонстрирует обработку CSV файла:

$fh = fopen("contacts.csv", "r"); while($line = fgetcsv($fh, 1000, ",")) { echo "Contact: {$line}"; }

Поиск строки в другой строке

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

Function contains($str, $content, $ignorecase=true){ if ($ignorecase){ $str = strtolower($str); $content = strtolower($content); } return strpos($content,$str) ? true: false; }

Проверяем, что строка начинается с определённого шаблона

Некоторые языки программирования, например, Java, имеют метод/функцию startWith, которая позволяет проверять, начинается ли строка с определённого шаблона. К сожалению, PHP не имеет такой простой встроенной функции.
Тем не менее, мы можем сделать её для себя, причём, очень просто::

Function String_Begins_With($needle, $haystack) { return (substr($haystack, 0, strlen($needle))==$needle); }

Выделяем email из строки

Когда-нибудь удивлялись, как спамеры получают ваши email адреса? Все просто. Они берут веб страницу (например, с форума) и проводят парсинг html кода для выделения emails адресов. Ниже приведённый код получает строку в качестве параметра и печатает все email, которые содержатся в ней. Пожалуйста, не используйте данный код для спама!

Function extract_emails($str){ // Регулярное выражение, которое извлекает все email из строки: $regexp = "/()+\@(()+\.)+({2,4})+/i"; preg_match_all($regexp, $str, $m); return isset($m) ? $m : array(); } $test_string = "Тестовая строка... [email protected] Проверяем другие форматы: [email protected]; foobar Ещё проверка: [email protected] test6example.org [email protected] test8@ example.org test9@!foo!.org foobar "; print_r(extract_emails($test_string));

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

Стоит отметить, что в PHP подразумевают большое количество методов, поэтому начинать их изучение стоит с самых простых манипуляций, таких как вывод строки, поиск, получение или замена подстроки, изменение регистра и возвращение длины строки. Многие функции плохо работают с кириллическими символами. Поэтому все примеры написаны на английском для наглядности. Для кириллических строк используются те же функции, но с префиксом mb_ (например, mb_strpos()). Прежде чем использовать аналоги, в php.ini необходимо раскомментировать строку;extension=php_mbstring.dll, просто убрав точку с запятой.

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

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

echo "Это Новая Строка"

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

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

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

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

$str1 = "Это";

$str2 = "Новая";

$str3 = "Строка";

echo $str1 . $str2 . $str3;

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

echo $str1 . " " . $str2 . " " . $str3;

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

$str1 = "Это";

$str2 = "Новая";

$str3 = "Строка";

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

echo $string;

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

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

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

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

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

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

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

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

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

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

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

$name = "Yemelyan";

$anotherName = "Katherin";

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

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

$name = "Yemelyan";

$anotherName = "Katherin";

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(), каждая из которых принимает одну переменную $string. Друг от друга они отличаются только типом возвращаемых данных: intval() возвращает целое число, а floatval() - число с плавающей точкой.

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

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

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

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

Функции для работы со строками

Для работы со строками в PHP существует множество полезных функций.

Кратко разберем часть функций для работы со строками.

Базовые строковые функции

strlen(string $st)

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

$x = "Hello!";
echo strlen($x); // Выводит 6

strpos(string $where, string $what, int $fromwhere=0)

Пытается найти в строке $where подстроку (то есть последовательность символов) $what и в случае успеха возвращает позицию (индекс) этой подстроки в строке. Необязательный параметр $fromwhere можно задавать, если поиск нужно вести не с начала строки $from , а с какой-то другой позиции. В этом случае следует эту позицию передать в $fromwhere . Если подстроку найти не удалось, функция возвращает false . Однако будьте внимательны, проверяя результат вызова strpos() на false - используйте для этого только оператор === . Пример:

echo strpos("Hello","el"); // Выводит 1

И еще пример:

if (strpos("Norway","rwa") !== false) echo "Строка rwa есть в Norway";
// При сравнении используйте операторы тождественных сравнений (===) (!==) чтобы избежать проблем с определением типов

substr(string $str, int $start [,int $length])

Данная функция тоже востребуется очень часто. Ее назначение - возвращать участок строки $str , начиная с позиции $start и длиной $length . Если $length не задана, то подразумевается подстрока от $start до конца строки $str . Если $start больше, чем длина строки, или же значение $length равно нулю, то возвращается пустая подстрока. Однако эта функция может делать и еще довольно полезные вещи. К примеру, если мы передадим в $start отрицательное число, то будет считаться, что это число является индексом подстроки, но только отсчитываемым от конца $str (например, -1 означает "начиная с последнего символа строки"). Параметр $length , если он задан, тоже может быть отрицательным. В этом случае последним символом возвращенной подстроки будет символ из $str с индексом $length , определяемым от конца строки. Примеры:

$str = "Programmer";
echo substr($str,0,2); // Выводит Pr
echo substr($str,-3,3); // Выводит mer

strcmp(string $str1, string $str2)

Сравнивает две строки посимвольно (точнее, побайтово) и возвращает: 0 , если строки полностью совпадают; -1 , если строка $str1 лексикографически меньше $str2 ; и 1 , если, наоборот, $str1 "больше" $str2 . Так как сравнение идет побайтово, то регистр символов влияет на результаты сравнений.

strcasecmp(string $str1, string $str2)

То же самое, что и strcmp(), только при работе не учитывается регистр букв. Например, с точки зрения этой функции "ab" и "AB" равны.

Функции для работы с блоками текста

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

str_replace(string $from, string $to, string $str)

Заменяет в строке $str все вхождения подстроки $from (с учетом регистра) на $to и возвращает результат. Исходная строка, переданная третьим параметром, при этом не меняется. Эта функция работает значительно быстрее, чем ereg_replace() , которая используется при работе с регулярными выражениями PHP, и ее часто используют, если нет необходимости в каких-то экзотических правилах поиска подстроки. Например, вот так мы можем заместить все символы перевода строки на их HTML эквивалент - тэг
:

$st=str_replace("\n","
\n",$str)

Как видим, то, что в строке
\n тоже есть символ перевода строки, никак не влияет на работу функции, т. е. функция производит лишь однократный проход по строке. Для решения описанной задачи также применима функция nl2br() , которая работает чуть быстрее.

string nl2br(string $string)

Заменяет в строке все символы новой строки \n на
\n и возвращает результат. Исходная строка не изменяется. Обратите внимание на то, что символы \r, которые присутствуют в конце строки текстовых файлов Windows, этой функцией никак не учитываются, а потому остаются на старом месте.

WordWrap(string $str, int $width=75, string $break="\n")

Эта функция, появившаяся в PHP4 , оказывается невероятно полезной, например, при форматировании текста письма перед автоматической отправкой его адресату при помощи mail() . Она разбивает блок текста $str на несколько строк, завершаемых символами $break , так, чтобы на одной строке было не более $width букв. Разбиение происходит по границе слова, так что текст остается читаемым. Возвращается получившаяся строка с символами перевода строки, заданными в $break . Пример использования:

$ str = "Это текст электронного письма, которое нужно будет отправить адресату..." ;
// Разбиваем текст по 20 символов
$ str = WordWrap ($ str , 20 , "
" );
echo $ str ;
// Выводит:
/* Это текст
электронного письма,
которое нужно будет
отправить
адресату... */
?>

strip_tags (string $str [, string $allowable_tags])

Еще одна полезная функция для работы со строками. Эта функция удаляет из строки все тэги и возвращает результат. В параметре $allowable_tags можно передать тэги, которые не следует удалять из строки. Они должны перечисляться вплотную друг к другу. Примеры:

$stripped = strip_tags ($str); // Удаляет все html - теги из строки (текста)
$stripped = strip_tags($str, ""); // Удалит все html - теги, кроме html - тегов <head> и <title></p> <h3>Функции для работы с отдельными символами</h3> <p>Как и в других языках программирования, в PHP можно работать с символами строк отдельно.</p> <p>Обратиться к любому символу строки можно по его индексу:</p> <p>$str = "PHP";<br> echo $str; // Выводит "P"</p> <p><b>chr(int $code) </b></p> <p>Данная функция возвращает строку, состоящую из символа с кодом $code . Пример:</p> <p>echo chr(75); //Выводит K</p> <p><b>ord($char) </b></p> <p>Данная функция возвращает код символа $char . Вот пример:</p> <p>echo ord("A"); // Выводит 65 - код буквы "A"</p> <h3>Функции удаления пробелов</h3> <p>Иногда трудно даже представить, какими могут быть странными пользователи, если дать им в руки клавиатуру и попросить напечатать на ней какое-нибудь слово. Так как клавиша пробела - самая большая, то пользователи имеют обыкновение нажимать ее в самые невероятные моменты. Этому способствует также и тот факт, что символ с кодом 32, обозначающий пробел, как вы знаете, на экране не виден. Если программа не способна обработать описанную ситуацию, то она, в лучшем случае после тягостного молчания отобразит в браузере что-нибудь типа "неверные входные данные", а в худшем - сделает при этом что-нибудь необратимое.</p><p><b>trim(string $str) </b></p> <p>Возвращает копию $str, только с удаленными ведущими и концевыми пробельными символами. Под пробельными символами я здесь и далее подразумеваю: пробел " ", символ перевода строки \n, символ возврата каретки \r и символ табуляции \t. Например, вызов trim(" test\n ") вернет строку "test". Эта функция используется очень широко. Старайтесь применять ее везде, где есть хоть малейшее подозрение на наличие ошибочных пробелов. Поскольку работает она очень быстро.</p> <p><b>ltrim(string $st) </b></p> <p>То же, что и trim() , только удаляет исключительно ведущие пробелы, а концевые не трогает. Используется гораздо реже.</p> <p><b>chop(string $st) </b></p> <p>Удаляет только концевые пробелы, ведущие не трогает.</p> <h3>Функции преобразования символов</h3> <p>Web-программирование - одна из тех областей, в которых постоянно приходится манипулировать строками: разрывать их, добавлять и удалять пробелы, перекодировать в разные кодировки, наконец, URL- кодировать и декодировать. В PHP реализовать все эти действия вручную, используя только уже описанные примитивы, просто невозможно из соображений быстродействия. Поэтому-то и существуют подобные встроенные функции.</p> <p><b>strtr(string $str, string $from, string $to) </b></p> <p>Эта функция применяется не столь широко, но все-таки иногда она бывает довольно полезной. Она заменяет в строке $str все символы, встречающиеся в $from , на их "парные" (то есть расположенные в тех же позициях, что и во $from) из $to .</p> <p>Следующие несколько функций предназначены для быстрого URL-кодирования и декодирования.</p> <p>URL-кодирование необходимо для передачи данных через интернет. Например, такое кодирование целесообразно, если вы передаете русскоязычную информацию в качестве параметра скрипта. Также подобное кодирование можно выполнить и для файла, чтобы не возникало коллизий из-за отсутствия поддержки 8-битных кодировок некоторыми серверами. Вот эти функции:</p> <p><b>UrlEncode(string $str) </b></p> <p>Функция URL-кодирует строку $str и возвращает результат. Эту функцию удобно применять, если вы, например, хотите динамически сформировать ссылку <a href=...> на какой-то сценарий, но не уверены, что его параметры содержат только алфавитно-цифровые символы. В этом случае воспользуйтесь функцией так:</p> <p>echo "<a href=/script.php?param=".UrlEncode($UserData);</p> <p>Теперь, даже если переменная $UserData включает символы = , & или даже, все равно сценарию будут переданы корректные данные.</p> <p><b>UrlDecode(string $st) </b></p> <p>Производит URL-декодирование строки. В принципе, используется значительно реже, чем UrlEncode() , потому что PHP и так умеет перекодировать входные данные автоматически.</p> <p><b>RawUrlEncode(string $st) </b></p> <p>Почти полностью аналогична UrlEncode() , но только пробелы не преобразуются в <b>+ </b>, как это делается при передаче данных из формы, а воспринимаются как обычные неалфавитно-цифровые символы. Впрочем, этот метод не порождает никаких дополнительных несовместимостей в коде.</p> <p><b>RawUrlDecode(string $st) </b></p> <p>Аналогична UrlDecode() , но не воспринимает <b>+ </b> как пробел.</p> <p><b>HtmlSpecialChars(string $str) </b></p> <p>Это функция, которая обычно используется в комбинации с echo . Основное ее назначение - гарантировать, что в выводимой строке ни один участок не будет воспринят как тэг.</p> <p>Заменяет в строке некоторые символы (такие как амперсант, кавычки и знаки "больше" и "меньше") на их HTML-эквиваленты, так, чтобы они выглядели на странице "самими собой". Самое типичное применение этой функции - формирование параметра value в различных элементах формы, чтобы не было никаких проблем с кавычками, или же вывод сообщения в гостевой книге, если вставлять тэги пользователю запрещено.</p> <p><b>StripSlashes(string $str) </b></p> <p>Заменяет в строке $str некоторые предваренные слэшем символы на их однокодовые эквиваленты. Это относится к следующим символам: <b>" </b>, <b>" </b>, <b>\ </b> и никаким другим.</p> <p><b>AddSlashes(string $str) </b></p> <p>Вставляет слэши только перед следующими символами: ", " и \. Функцию очень удобно использовать при вызове <b>eval() </b> (эта функция выполняет строку, переданную ей в параметрах, так, как будто имеет дело с небольшой PHP-программой.</p> <h3>Функции изменения регистра</h3> <p>Довольно часто нам приходится переводить какие-то строки, скажем, в верхний регистр, т. е. делать все прописные буквы в строке заглавными. В принципе, для этой цели можно было бы воспользоваться функцией strtr() , рассмотренной выше, но она все же будет работать не так быстро, как нам иногда хотелось бы. В PHP есть функции, которые предназначены специально для таких нужд. Вот они:</p> <p><b>strtolower(string $str) </b></p> <p>Преобразует строку в нижний регистр. Возвращает результат перевода.</p> <p>Надо заметить, что при неправильной настройке локали (это набор правил по переводу символов из одного регистра в другой, переводу даты и времени, денежных единиц и т. д.) функция будет выдавать неправильные результаты при работе с буквами кириллицы.<br> Возможно, в несложных программах, а также если нет уверенности в поддержке соответствующей локали операционной системой, проще будет воспользоваться "ручным" преобразованием символов, задействуя функцию strtr() :</p> <p>$st=strtr($st, "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩљЫЬЭЮЯ", "абвгдеёжзийклмнопрстуфхцчшщъыьэюя");</p> <p>Главное достоинство данного способа - то, что в случае проблем с кодировкой для восстановления работоспособности сценария вам придется всего лишь преобразовать его в ту же кодировку, в которой у вас хранятся документы на сервере.</p> <p><b>strtoupper(string $str) </b></p> <p>Переводит строку в верхний регистр. Возвращает результат преобразования. Эта функции также прекрасно работает со строками, составленными из латиницы, но с кирилицей может возникнуть все та же проблема.</p> <h3>Установка локали (локальных настроек)</h3> <p>Локалью будем называть совокупность локальных настроек системы, таких как формат даты и времени, язык, кодировка.</p> <p>Настройки локали сильно зависят от операционной системы.</p> <p>Для установки локали используется функция SetLocale() :</p> <p><b>SetLocale(string $category, string $locale) </b></p> <p>Функция устанавливает текущую локаль, с которой будут работать функции преобразования регистра символов, вывода даты-времени и.т.д. Вообще говоря, для каждой категории функций локаль определяется отдельно и выглядит по-разному. То, какую именно категорию функций затронет вызов SetLocale() , задается в параметре $category . Он может принимать следующие строковые значения:</p> <p>LC_CTYPE - активизирует указанную локаль для функций перевода в верх-<br> ний/нижний регистры;<br> LC_NUMERIC - активизирует локаль для функций форматирования дробных чи-<br> сел - а именно, задает разделитель целой и дробной части в числах;<br> LC_TIME - задает формат вывода даты и времени по умолчанию;<br> LC_ALL - устанавливает все вышеперечисленные режимы.</p> <p>Теперь о параметре $locale . Как известно, каждая локаль, установленная в системе, имеет свое уникальное имя, по которому к ней можно обратиться. Именно оно и фиксируется в этом параметре. Однако, есть два важных исключения из этого правила. Во-первых, если величина $locale равна пустой строке "", то устанавливается та локаль, которая указана в глобальной переменной окружения с именем, совпадающим с именем категории $category (или LANG - она практически всегда присутствует в Unix). Во вторых, если в этом параметре передается 0, то новая локаль не устанавливается, а просто возвращается имя текущей локали для указанного режима.</p> <p>К сожалению, имена локалей задаются при настройке операционной системы, и для них, по-видимому, не существует стандартов. Выясните у своего хостинг-провайдера, как называются локали для разных кодировок русских символов. Но, если следующий фрагмент работает у вашего хостинг-провайдера, это не означает, что он заработает, например, под Windows:</p> <p>setlocale("LC_CTYPE","ru_SU.KOI8-R");</p> <p>Здесь вызов устанавливает таблицу замены регистра букв в соответствии с кодировкой KOI8-R.</p> <p>По правде говоря, локаль - вещь довольно непредсказуемая и довольно плохо переносимая между операционными системами. Так что, если ваш сценарий не очень велик, задумайтесь: возможно, лучше будет искать обходной путь, например, используя strtr() , а не рассчитывать на локаль.</p> <h3>Функции преобразования кодировок</h3> <p>Часто встречается ситуация, когда нам требуется преобразовать строку из одной кодировки кириллицы в другую. Например, мы в программе сменили локаль: была кодировка windows , а стала - KOI8-R . Но строки-то остались по-прежнему в кодировке WIN-1251 , а значит, для правильной работы с ними нам нужно их перекодировать в KOI8-R. Для этого и служит функция преобразования кодировок.</p> <p><b>convert_cyr_string(string $str, char $from, char $to); </b></p> <p>Функция переводит строку $str из кодировки $from в кодировку $to. Конечно, это имеет смысл только для строк, содержащих "русские" буквы, т. к. латиница во всех кодировках выглядит одинаково. Разумеется, кодировка $from должна совпадать с истинной кодировкой строки, иначе результат получится неверным. Значения $from и $to - один символ, определяющий кодировку:</p> <p>k - koi8-r<br> w - windows-1251<br> i - iso8859-5<br> a - x-cp866<br> d - x-cp866<br> m - x-mac-cyrillic</p> <p>Функция работает достаточно быстро, так что ее вполне можно применять, скажем, для перекодировки писем в нужную форму перед их отправкой по электронной почте.</p> <h3>Функции форматных преобразований строк</h3> <p>Как мы знаем, переменные в строках PHP интерполируются, поэтому практически всегда задача "смешивания" текста со значениями переменных не является проблемой. Например, мы можем спокойно написать что-то вроде:</p> <p>echo "Привет, $name! Вам $age лет.";</p> <p>В Си для аналогичных целей используется следующий код:</p> <p>printf("Привет, %s! Вам %s лет",name,age);</p> <p>Язык PHP также поддерживает ряд функций, использующих такой же синтаксис, как и их Си -эквиваленты. Бывают случаи, когда их применение дает наиболее красивое и лаконичное решение, хотя это и случается довольно нечасто.</p> <p><b>sprintf(string $format [, mixed args, ...]) </b></p> <p>Эта функция - аналог функции sprintf() в Си. Она возвращает строку, составленную на основе строки форматирования, содержащей некоторые специальные символы, которые будут впоследствии заменены на значения соответствующих переменных из списка аргументов.<br> Строка форматирования $format может включать в себя команды форматирования, предваренные символом % . Все остальные символы копируются в выходную строку как есть. Каждый спецификатор формата (то есть, символ % и следующие за ним команды) соответствует одному, и только одному параметру, указанному после параметра $format . Если же нужно поместить в текст % как обычный символ, необходимо его удвоить:</p> <p>echo sprintf("The percentage was %d%%",$percentage);</p> <p>Каждый спецификатор формата включает максимум пять элементов (в порядке их следования после символа %):</p> <p>>>> Необязательный спецификатор размера поля, который указывает, сколько символов будет отведено под выводимую величину. В качестве символов-заполнителей (если значение имеет меньший размер, чем размер поля для его вывода) может использоваться пробел или 0, по умолчанию подставляется пробел. Можно задать любой другой символ-наполнитель, если указать его в строке форматирования, предварив апострофом ".</p> <p>>>> Опциональный спецификатор выравнивания, определяющий, будет результат выровнен по правому или по левому краю поля. По умолчанию производится выравнивание по правому краю, однако можно указать и левое выравнивание, задав символ - (минус).</p> <p>>>> Необязательное число, определяющее размер поля для вывода величины. Если результат не будет в поле помещаться, то он "вылезет" за края этого поля, но не будет усечен.</p> <p>>>> Необязательное число, предваренное точкой ".", предписывающее, сколько знаков после запятой будет в результирующей строке. Этот спецификатор учитывается только в том случае, если происходит вывод числа с плавающей точкой, в противном случае он игнорируется.</p> <p>>>> Наконец, обязательный (заметьте - единственный обязательный!) спецификатор типа величины, которая будет помещена в выходную строку:</p> <p><b>b </b> - очередной аргумент из списка выводится как двоичное целое число;<br><b>c </b> - выводится символ с указанным в аргументе кодом;<br><b>d </b> - целое число;<br><b>f </b> - число с плавающей точкой;<br><b>o </b> - восьмеричное целое число;<br><b>s </b> - строка символов;<br><b>x </b> - шестнадцатеричное целое число с маленькими буквами <i>a-z </i>;<br><b>X </b> - шестнадцатеричное число с большими буквами <i>A-Z </i>.</p> <p>Вот как можно указать точность представления чисел с плавающей точкой:</p> <p>$money1 = 68.75;<br> $money2 = 54.35;<br> $money = $money1 + $money2;<br> // echo $money выведет "123.1"...<br> $formatted = sprintf ("%01.2f", $money);<br> // echo $formatted выведет "123.10" !</p> <p>Вот пример вывода целого числа, предваренного нужным количеством нулей:</p> <p>$isodate=sprintf("%04d-%02d-%02d",$year,$month,$day);</p> <p><b>printf(string $format [, mixed args, ...]) </b></p> <p>Делает то же самое, что и sprintf() , только результирующая строка не возвращается, а направляется в браузер пользователя.</p> <p><b>number_format(float $number, int $decimals, string $dec_point=".", string $thousands_sep=","); </b></p> <p>Эта функция форматирует число с плавающей точкой с разделением его на триады с указанной точностью. Она может быть вызвана с двумя или четырьмя аргументами, но не с тремя! Параметр $decimals задает, сколько цифр после запятой должно быть у числа в выходной строке. Параметр $dec_point представляет собой разделитель целой и дробной частей, а параметр $thousands_sep - разделитель триад в числе (если указать на его месте пустую строку, то триады не отделяются друг от друга).</p> <p>В PHP существует еще несколько функций для выполнения форматных преобразований, среди них - <b>sscanf() </b> и <b>fscanf() </b>, которые часто применяются в Си. Однако в PHP их использование весьма ограничено: чаще всего для разбора строк оказывается гораздо выгоднее привлечь регулярные выражения или функцию <b>explode() </b>.</p> <h3>Хэш-функции</h3> <p><b>md5(string $str) </b></p> <p>Возвращает хэш-код строки $str , основанный на алгоритме корпорации RSA Data Security под названием " MD5 Message-Digest Algorithm ". Хэш-код - это просто строка, практически уникальная для каждой из строк $str . То есть вероятность того, что две разные строки, переданные в $str , дадут нам одинаковый хэш-код, стремится к нулю.</p> <p>Если длина строки $str может достигать нескольких тысяч символов, то ее MD5-код занимает максимум 32 символа.</p> <p>Для чего нужен хэш-код и, в частности, алгоритм MD5 ? Например, для проверки паролей на истинность.</p> <p>Пусть, к примеру, у нас есть система со многими пользователями, каждый из которых имеет свой пароль. Можно, конечно, хранить все эти пароли в обычном виде, или зашифровать их каким-нибудь способом, но тогда велика вероятность того, что в один прекрасный день этот файл с паролями у вас украдут.</p> <p>Сделаем так: в файле паролей будем хранить не сами пароли, а их (MD5) хэш-коды. При попытке какого либо пользователя войти в систему мы вычислим хэш-код только что введенного им пароля и сравним его с тем, который записан у нас в базе данных. Если коды совпадут, значит, все в порядке, а если нет - что ж, извините...<br> Конечно, при вычислении хэш-кода какая-то часть информации о строке $str безвозвратно теряется. И именно это позволяет нам не опасаться, что злоумышленник, получивший файл паролей, сможет его когда-нибудь расшифровать. Ведь в нем нет самих паролей, нет даже их каких-то связных частей!</p> <p>Пример использования алгоритма хеширования MD5:</p> <p><? php <br>$ pass_a = "MySecret" ; <br>$ pass_b = "MySecret" ; <br><span>// Выводим хеш-код строки MySecret ($pass_a) - исходный пароль </span><br>echo <span>"<b>Хеш-код исходного пароля "$pass_a":</b><b style=\"color:green\">" </span>. md5 ($ pass_a ). "</b><br>" ; <br><span>// Выводим хеш-код строки MySecret ($pass_b) - верифицируемый пароль </span><br>echo <span>"<b>Хеш-код верифицируемого пароля "$pass_b":</b><b style=\"color:green\">" </span>. md5 ($ pass_b ). "</b><br>" ; <br><span>// Сравниваем хеш-коды MD5 исходного и верифицируемого пароля </span><br>echo <span>"<h3>Проверяем истинность введенного пароля:</h3>" </span>; <br>if (md5 ($ pass_a )=== md5 ($ pass_b )) echo <span>"<h3 style=\"color:green\">Пароль верный! (Хеш-коды совпадают)</h3>" </span>; <br>else echo <span>"<h3 style=\"color:red\">Пароль неверный! (Хеш-коды не совпадают)</h3>" </span><br><span>// В данной ситуации выводит: Пароль верный! (Хеш-коды совпадают) </span><br><span>// Попробуйте изменить значение строки $pass_b:) </span><br>?> </p> <p><b>crc32(string $str) </b></p> <p>Функция crc32() вычисляет 32-битную контрольную сумму строки $str. То есть, результат ее работы - 32 битное (4-байтовое) целое число. Эта функция работает гораздо быстрее md5(), но в то же время выдает гораздо менее надежные "хэш-коды" для строки.</p> <h3>Функции сброса буфера вывода</h3> <p>Эта функция имеет очень и очень отдаленное отношение к работе со строками, но она еще дальше отстоит от других функций.</p> <p>Начнем издалека: обычно при использовании echo данные не прямо сразу отправляются клиенту, а накапливаются в специальном буфере, чтобы потом транспортироваться большой "пачкой". Так получается быстрее.</p> <p>Однако, иногда бывает нужно досрочно отправить все данные из буфера пользователю, например, если вы что-то выводите в реальном времени (так зачастую работают чаты). Вот тут-то вам и поможет функция flush() , которая отправляет содержимое буфера echo в браузер пользователя.</p> <table width="600" border="0" align="center" cellpadding="3" cellspacing="1" bgcolor="#000066" class="mtx1"><tr><td bgcolor="#CAEEFF"> <b><<< Назад </b> <br>(Строки (Часть 2)) </td> <td bgcolor="#CAEEFF"> <b>Содержание </b> </td> <td bgcolor="#CAEEFF"> <b>Вперед >>> </b> <br>(Строки (Часть 4)) </td> </tr></table><br><table width="470" border="0" align="center" cellpadding="3" cellspacing="1" bgcolor="#000066" class="mtx1"><tr><td bgcolor="#CAEEFF"> Есть еще вопросы или что-то непонятно - добро пожаловать на наш </td> </tr><tr><td bgcolor="#F7F7F7"> </td> </tr><tr><td bgcolor="#CAEEFF"> <table width="100%"><tr><td width="100%"></td></tr></table></td></tr></table> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> </div> </article> <div class="related_block"> <div class="title">Похожие публикации</div> <ul class="recent_ul"> <li> <div class="img_block"> <div class="overlay"></div> <img src="/uploads/a7b211290b2a22304b491107da765d4e.jpg" style="width:230px; height:145px;" / loading=lazy></div> <a href="/iphone-4-gabarity-kakaya-diagonal-ekrana-u-iphone-ekran-kamery-i-grafika.html">Какая диагональ экрана у iPhone</a></li> <li> <div class="img_block"> <div class="overlay"></div> <img src="/uploads/e89fb5dbc0ef71113243b78cb4dbe79c.jpg" style="width:230px; height:145px;" / loading=lazy></div> <a href="/kak-bystro-proindeksirovat-novye-stranicy-opasnost-medlennoi-indeksacii.html">Опасность медленной индексации</a></li> <li> <div class="img_block"> <div class="overlay"></div> <img src="/uploads/e8e4019151b42ba7a865dcc5d77caad5.jpg" style="width:230px; height:145px;" / loading=lazy></div> <a href="/pereproshivaem-sony-xperia-s-pomoshchyu-programmy-flashtool-pereproshivaem-sony-xperia-s-pomoshchyu-program.html">Перепрошиваем Sony Xperia с помощью программы Flashtool Процесс создания прошивки с помощью Flashtool</a></li> </ul> </div> </div> <aside id="sidebar"> <div class="block"> <nav class="sidebar_menu"> <div class="menu-sidebar_menu-container"> <ul id="menu-sidebar_menu" class="menu"> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/programs/">Программы</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/windows/">Windows</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/devices/">Устройства</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/browsers/">Браузеры</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/reviews/">Обзоры </a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/reviews/">Обзоры</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/setup/">Настройка </a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/torrent/">Торрент</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/editors/">Редакторы</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/instagram/">Инстаграм</a></li> </ul> </div> </nav> </div> <div class="block recent_block"> <div class="title">Последние записи</div> <ul class="popular"> <li> <div class="img_block"> <div class="overlay"></div> <img width="240" height="145" src="/uploads/0196a1de1f23772851301731a38c464b.jpg" class="attachment-popular_thumb size-popular_thumb wp-post-image" alt="ICO: Как продать токены Как завершается ICO криптовалюты и что делать инвестору" / loading=lazy> <span class="cat">Редакторы</span></div> <a href="/chego-zhdat-posle-ico-kriptovalyuty-sudba-tokenov-posle-prodazhi-ico-kak-prodat.html">ICO: Как продать токены Как завершается ICO криптовалюты и что делать инвестору</a></li> <li> <div class="img_block"> <div class="overlay"></div> <img width="240" height="145" src="/uploads/f4e41f99a2ca7f2c351568ae06b893b3.jpg" class="attachment-popular_thumb size-popular_thumb wp-post-image" alt="Как убрать всплывающие окна в Яндекс" / loading=lazy> <span class="cat">Редакторы</span></div> <a href="/kak-otklyuchit-vsplyvayushchie-okna-v-brauzere-kak-ubrat-vsplyvayushchie-okna-v.html">Как убрать всплывающие окна в Яндекс</a></li> <li> <div class="img_block"> <div class="overlay"></div> <img width="240" height="145" src="/uploads/1db3ec6d144a82365241122fda9f2c67.jpg" class="attachment-popular_thumb size-popular_thumb wp-post-image" alt="Как переключать в браузере вкладки с помощью клавиатуры" / loading=lazy> <span class="cat">Редакторы</span></div> <a href="/navigaciya-v-windows-s-pomoshchyu-klaviatury-ili-kak-rabotat-bez-myshki.html">Как переключать в браузере вкладки с помощью клавиатуры</a></li> </ul> </div> </aside> </div> </div> <div class="clear"></div> <footer id="footer"><div class="wrapper"> <div class="copy">© 2024 | Компьютеры для всех - Настройка, установка, восстановление</div> <nav class="header_menu"> <div class="menu-footer_menu-container"> </div> </nav> </div></footer> <div id="toTop"></div> <script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js'></script> <nav class="mobile_menu"> <div class="close_menu"></div> <div class="mob_menu"> <div class="menu-mobile_menu-container"> <ul id="menu-mobile_menu" class="menu"> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/programs/">Программы</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/windows/">Windows</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/devices/">Устройства</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/browsers/">Браузеры</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/reviews/">Обзоры </a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/reviews/">Обзоры</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/setup/">Настройка </a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/torrent/">Торрент</a></li> </ul> </div> </div> </nav> </body> </html> <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>