В Интернете часто приходится проводить манипуляцию со строками. По этой причине необходимо знать и уметь использовать встроенные функции PHP, предназначенные для обработки строк. Например, перед добавлением сообщения в гостевую книгу можно удалить лишние пробелы и все теги из сообщения, добавить защитные слэши перед специальными символами или заменить их на HTML-эквиваленты и т.д.
Рассмотрим эти функции, позволяющие работать со строками, с локалью, символами и кодировками. Поиск и замена в строке, сравнения строк, кодирования, а также работой с регулярными выражениями.
Работа с строками в PHP является очень важным аспектом разработки сайтов. Перечислим основные функции:
strlen () — возвращает количество символов в строке.
$str = "Строка"; echo strlen($str); // Выведет 6
trim() — удаляет пробельные символы в начале и конце строки. Пробельными символами считаются: пробел, символ перевода строки (\n), символ возврата каретки (\r), символы горизонтальной (\t) и вертикальной (\v) табуляции и символ конца строки (\0).
$str = " Строка "; $str = trim($str); echo "\"$str\""; // Выведет "Строка"
ltrim() — удаляет пробельные символы в начале строки.
$str = " Строка "; $str = ltrim($str); echo "\"$str\""; // Выведет "Строка "
chop () — удаляет пробельные символы в конце строки.
$str = " Строка "; $str = chop($str); echo "\"$str\""; // Выведет " Строка"
strip_tags () — удаляет из строки все HTML-тэги, за исключением указанных во втором параметре.
$str = "<FONT color='red'><B>Строка</B></FONT>"; $str1 = strip_tags($str); $str2 = strip_tags($str, "<B>"); echo "$str1 <BR>"; // Выведет "Строка" echo "$str2"; // Выведет "<В>Строка</В>"
Addslashes () — добавляет защитный слэш перед специальными символами.
$str = '"Волга", "Москвич", "Жигули"'; $str = AddSlashes($str); echo "$str"; // Выведет \"Волга\", \"Москвич\", \"Жигули\"
stripsiashes () — удаляет защитные слэши.
$str = '\"Волга\", \"Москвич\", \"Жигули\"'; $str = StripSlashes($str); echo "$str"; // Выведет "Волга", "Москвич", "Жигули"
HtmlSpecialchars () — заменяет специальные символы на их HTML эквиваленты.
$str = '"Волга", "Москвич"'; $str = HtmlSpecialchars($str); echo "$str"; // Выведет "Boлгa" , "Mocквич"
split() — разделяет строку на подстроки по указанному разделителю и добавляет их в массив. Функция позволяет использовать регулярные выражения.
$str = "Фамилия\tИмя\tОтчество\tГод рождения"; $Mass = split("\t", $str); for($i=0; $i<count($Mass); $i++) { echo "$Mass[$i] <BR>"; } // $Mass = Фамилия, Имя, Отчество, Год рождения
exploded — разделяет строку на подстроки по указанному разделителю и добавляет их в массив. Аналогична функции split (), но с регулярными выражениями не работает.
$str = "Фамилия\tИмя\tОтчество\tГод рождения"; $Mass = explode ("\t"', $str); for($i=0; $i<count($Mass); $i++) { echo "$Mass[$i] <BR>"; } // $Mass = Фамилия, Имя, Отчество, Год рождения
substro — возвращает подстроку указанной длины начиная с заданной позиции. Если длина не указана, то возвращается подстрока, начиная с заданной позиции и до конца строки. Функция имеет следующий формат:
substr(, , []);
$str = "Строка"; $strl = substr($str, 0, 1); echo "$strl"; // Выведет "С" $str2 = substr($str, 1); echo "$str2"; // Выведет "трока"
wordwrap () — позволяет разбить длинный текст на строки указанной длины. Функция имеет следующий формат:
Wordwrap(, , );
$str = "Очень длинная строка перед выводом"; echo Wordwrap($str, 7, "<BR>");
Выведет каждое слово на отдельной строчке:
Очень
длинная
строка
перед
выводом
n12br() — добавляет перед всеми символами новой строки (\ n) тэг
(XML-аналог HTML-тэга <_br>).
$str = "Очень\ nдлинная\ nстрока\ nперед\ nвыводом"; echo nl2br($str);
Исходный HTML-код будет выглядеть следующим образом:
Очень
длинна
строка
перед
выводом
В окне Web-браузера каждое слово будет на своей строчке.
strtoupper () — делает все символы строки прописными буквами.
$str = "очень длинная строка"; SetLocale(LC_CTYPE, "ru_RU.СР1251"); // Настройка локали echo strtoupper($str); // ОЧЕНЬ ДЛИННАЯ СТРОКА
strtolower () — делает все символы строки строчными буквами.
$str = "ОЧЕНЬ длинная строка"; SetLocale(LC_CTYPE, "ru_RU.CP1251"); // Настройка локали echo strtolower($str); // очень длинная строка
ucfirst () — делает первый символ строки прописным.
$str = "очень длинная строка"; SetLocale(LC_CTYPE, "ru_RU.CP1251"); // Настройка локали ' echo ucfirst($str); // Очень длинная строка
ucwords () — делает первые символы всех слов прописными.
$str = "очень длинная строка"; SetLocale(LC_CTYPE, "ru_RU.CP1251"); // Настройка локали echo ucwords($str); // Очень Длинная Строка
Настройка локали
При изменении регистра русских букв может возникнуть проблема. Чтобы ее избежать, необходимо правильно настроить локаль. Локалью называют совокупность локальных настроек системы.
Для установки локали используется функция SetLocale(). Функция имеет следующий формат:
SetLocale(, );
Параметр может принимать следующие значения:
LC_ALL — устанавливает локаль для всех режимов;
LC_COLLATE — для сравнения строк;
LC_CTYPE — для перевода символов в нижний или верхний регистр;
LC_MONETARY — для отображения денежных единиц;
LC_NUMERIC —для форматирования дробных чисел;
LC_TIME — для форматирования вывода даты и времени.
$str = "очень длинная строка"; SetLocale(LC_CTYPE, "ru_RU.CP1251"); // Настройка локали echo strtoupper($str); // ОЧЕНЬ ДЛИННАЯ СТРОКА
Функции для работы с символами
chr()—возвращает символ по указанному коду.
echo chr(81); // Выведет Q
ord () —возвращает код указанного символа.
echo ord(«Q»); // Выведет 81
Поиск и замена в строке
strpos () — ищет подстроку в строке. Возвращает номер позиции, с которой начинается вхождение подстроки в строку. Если подстроки нет в строке, то функция возвращает false. Функция зависит от регистра символов. Имеет следующий формат:
strpos(<Строка>, <Подстрока>, [<Начальная позиция поиска>]);
Если начальная позиция не указана, то поиск будет производиться с начала строки.
if (strpos("Привет", "При") !== false) echo "Найдено"; //Выведет "Найдено" else echo "Не найдено";
str_repiace() — производит замену всех вхождений и возвращает результат в виде новой строки. Функция не изменяет исходную строку и зависит от регистра символов. Имеет следующий формат:
str_replace(, , );
$str = "Привет, Петя"; $str = str_replace("Петя", "Вася", $str); echo $str; // Выведет "Привет, Вася"
Функции для сравнения строк
strcmp(, ) — сравнивает две строки. Зависит от регистра символов. Возвращает одно из трех значений:
• 0 — если строки равны;
• 1 — если больше ;
• -1 — если меньше .
$strl = "Строка1"; $str2 = "Строка2"; echo strcmp($strl, $str2); // Выведет -1
strcoll (, ) — сравнение строк на основе локализации. Зависит от регистра символов. Если локаль не настроена, то эта функция эквивалентна функции strcmp ().
SetLocale(LC_ALL, "ru_RU.CP1251"); // Настройка локали $strl = "Строка1"; $str2 = "Строка2"; echo strcoll($strl, $str2); // Выведет -1
strcasecmp () — сравнивает две строки без учета регистра.
$strl = "строка"; $str2 = "Строка"; echo strcmp($strl, $str2); // Выведет 1 echo strcasecmp($strl, $str2); // Выведет 0
Кодирование строки
urlEncode() — выполняет URL-кодирование строки. URL-кодирование необходимо для передачи русского текста в строке URL-адреса в качестве параметра сценария.
$str = "Текст на русском языке"; echo UrlEncode($str); // Выведет %D2%E5%EA%F1%F2+%ED%E0+%F0%F3%F1%F1%EA%EE%EC+%FF%E7%FB%EA%E5
UrlDecode () — раскодирует строку, закодированную с помощью функции UrlEncode().
$str = "Текст на русском языке"; $str = UrlEncode($str); echo UrlDecode($str); // Выведет Текст на русском языке
Кроме этих функций можно использовать функции RawUrlEncode () и RawUrlDecode().
$str = "Текст на русском языке"; $str = RawUrlEncode($str); echo "$str <BR>"; // Выведет // %D2%E5%EA%F1%F2%20%ED%EO%20%FO%F3%F1%F1%EA%EE%EC%20%FF%E7%FB%EA%E5 echo RawUrlDecode($str); // Выведет Текст на русском языке
Обратите внимание, символ пробела заменяется не знаком +, а символами %20.
md5 () — кодирует строку, используя алгоритм MD5. Используется для кодирования паролей, т. к. не существует алгоритма для дешифровки. Для сравнения введенного пользователем пароля с сохраненным в базе, необходимо зашифровать введенный пароль, а затем произвести сравнение.
$pass = "password"; $pass = md5($pass); // Пароль, сохраненный в базе echo $pass; // Выведет 5f4dcc3b5aa765d61d8327deb882cf99 $pass2 = "password"; // Пароль, введенный пользователем if ($pass === md5($pass2)) echo "Пароль правильный";
crc32 () — кодирует строку, используя алгоритм DES.
$pass = "password"; $pass = crc32($pass); echo $pass; // Выведет 901924565
Преобразование кодировок
С помощью функции convert_cyr_string() можно преобразовать строку из одной кодировки в другую. Функция имеет следующий формат:
convert_cyr_string(<Исходная строка>, <Исходная кодировкам <Нужная кодировка>);
Параметры и могут принимать следующие значения:
а или d — кодировка х-ср866;
i — кодировка iso8859-5;
к — кодировка koi8-r;
m — кодировка x-mac-Cyrillic;
w — кодировка windows-1251 (cpl251).
$str - "уФТПЛБ"; echo convert_cyr_string($str, "k", "w"); // Выведет Строка
Функция iconv() также преобразовывает символы строки из одной кодировки в другую. Функция имеет следующий формат:
icоnv(<Исходная кодировка>, <Нужная кодировкам <Исходная строка>); iconv("windows-1251", "UTF-8", "Строка");
Регулярные выражения. Разбираем адрес электронной почты на составные части. Проверяем правильность введенной даты
Регулярные выражения позволяют осуществить сложный поиск. Использовать регулярные выражения позволяют следующие функции:
ereg() — выполняет поиск в строке с помощью регулярного выражения. Зависит от регистра символов. Функция имеет следующий формат:
ereg(<Регулярное выражение>, <Строка>, [<Массив>]);
В параметре сохраняются соответствия подвыражений с шаблоном.
$str = "admin@mail.ru"; ereg("^([a-z0-9_\.\-]+)@(([a-z0-9\-]+\.)+[a-z]{2,4})$", $str, $Mass); for($i=0; $i<count($Mass); $i++) { echo "$Mass[$i] <BR>"; }
Выведет
admin@mail.ru
admin
mail.ru
mail.
Первый элемент массива соответствует найденной строке. Второй строке в первых круглых скобках, третий — во вторых круглых скобках и т. д
eregi () — выполняет поиск в строке с помощью регулярного выраженш без учета регистра символов.
С помощью функций ereg() и eregi о обычно проверяются входные данные. Например, правильность ввода E-mail можно проверить следующие образом:
$str = "admin@mail.ru"; $pattern = "^[а-z0-9_\.\-]+@([a-z0-9\-]+\.)+[a-z]{2,4}$"; if (eregi($pattern, $str)) echo "Нормально"; else echo "Нет"; // Выведет Нормально
ereg_repiace () — возвращает строку, которая является результатом поиска и замены в исходной строке, используя регулярное выражение, Функция зависит от регистра символов. Имеет следующий формат:
ereg_replace (<Регулярное выражение>, <Новая строка>, <Исходнаи строка>); $str = "2001, 2002, 2003, 2004, 2005"; $pattern = "200[14] echo ereg_replace($pattern, "2007", $str); // Выведет 2007, 2002, 2003, 2007, 2005
eregi_replace () — выполняет поиск и замену без учета регистра символов. Формат такой же, как И у функции ereg_replace ().
Функция split () также поддерживает регулярные выражения. Она разделяет строку на подстроки по указанному разделителю и добавляет их в массив.
$str = "admin@mail.ru"; $Mass = split("[@\.]", $str); for($i=0; $i<count($Mass); $i++) { echo "$Mass[$i] <BR>"; }
Выведет
admin
mail
ru
Метасимволы, используемые в регулярных выражениях
^ — — привязка к началу строки.
$ — привязка к концу строки.
$str = "2"; if (ereg("^[0-9]+$", $str)) echo "Число"; // Выведет "Число" else echo "He число"; $str = "Строка2"; if (ereg("^[0-9]+$", $str)) echo "Число"; // Выведет "Не число" else echo "He число";
Если убрать привязку к началу и концу строки, то любая строка, содержащая число, вернет «Число».
$str = "Строка2"; if (ereg("[0-9]+", $str)) echo "Число"; // Выведет "Число" else echo "He число";
Можно указать привязку только к началу или только к концу строки.
$str = "Строка2"; if (ereg("[0-9]+$", $str) ) echo "Есть число в конце строки"; else echo "Нет числа в конце строки"; // Выведет "Есть число в конце строки"
if (ereg("Л[0-9]+", $str)) echo "Есть число в начале строки"; else echo "Нет числа в начале строки"; // Выведет "Нет числа в начале строки"
[] — позволяет указать символы, которые могут встречаться на этом месте в строке. Можно перечислять символы подряд или указать диапазон через тире.
• [ 09 ] — соответствует числу 0 или 9.
• [0-9] — соответствует любому числу от 0 до 9.
• [абв] —соответствует буквам «а», «б» и «в».
• [а-г] —соответствует буквам «а», «б», «в» и «г».
• [а-я] — соответствует любой букве от «а» до «я».
• [абс] — соответствует буквам «А», «Б» и «С». Обратите внимание, если используется функция ereg(), то регистр будет имеет значение.
• [А-Я] — соответствует любой букве от «А» до «Я».
• [а-яА-Я] — соответствует любой букве в любом регистре.
• [0-9а-яА-Яa-zA-Z] — любая цифра и любая цифра независимо от регистра и языка.
Значение можно инвертировать, если после первой скобки указать символ ^. В итоге можно указать символы, которых не должно быть на этом месте в строке.
[^09] — не число 0 или 9.
[^0-9] — не число от 0 до 9.
[^а-яА-Яа-zА-Z] — не буква.
Вместо перечисления символов можно использовать стандартные классы:
[[:alnum:]] — алфавитно-цифровые символы;
[[:alpha:]] — буквенные символы;
[[:lower:]] — строчные буквы;
[[:upper:]] — прописные буквы;
[[:digit:]] — десятичные цифры;
[[:xdigit:]] — шестнадцатеричные цифры;
[[:punct:]] — знаки пунктуации;
[[:blanc:]] — символы табуляции и пробелов;
[[:space:]] — символы свободного места;
[[:cntrl:]] — управляющие символы;
[[:print:]] — печатные символы;
[[:graph:]]
— печатные символы, за исключением пробельных;
. (точка) — любой символ, кроме символа новой строки (\n).
Обратите внимание
Стандартные классы работают только с буквами латинского алфавита. С буквами русского языка не работают.
Что же делать, если нужно найти точку, ведь символ «точка» соответствует любому символу, кроме символа перевода строки? Для этого перед специальным символом необходимо указать символ «\». Продемонстрируем на примере:
$str = "29,04.2007"; // Неправильная дата (вместо указана запятая) $pattern = "^[0-3][[:digit:]].[01][[:digit:]].[12][09][[:digit:]][[:digit:]]$"; // Символ "\" не указан перед точкой
if (ereg($pattern , $str)) echo "Дата введена правильно"; else echo "Дата введена неправильно"; // Выведет "Дата введена правильно", т. к. точка означает любой символ
$pattern = "^[0-3][[:digit:]]\.[01][[:digit:]]\.[12][09][[:digit:]][[:digit:]]$"; // Символ "\" указан перед точкой if (ereg($pattern , $str)) echo "Дата введена правильно"; else echo "Дата введена неправильно"; // Выведет "Дата введена неправильно", т. к. перед точкой указан символ "\"
Количество вхождений символа в строку задается с помощью квантификаторов:
{n} — соответствует n вхождениям символа в строку.
[[:digit:]] {2} — соответствует двум вхождениям любой цифры.
{n,} — по крайней мере п вхождений символа в строку или более.
[[:digit:]] {2,} — соответствует двум и более вхождениям любой цифры.
{n,m} — не менее n вхождений символа в строку и не более m. Цифры указываются через запятую без пробела.
[[digit:]] {2,5} — соответствует от двух до пяти вхождениям любой цифры.
* — ноль или большее число вхождений символа в строку.
[[:digit:]]*— цифры могут не встретиться в строке или встретиться много раз.
+ — один или большее число вхождений символа в строку.
[[:digit:]] + — цифра может встретиться один раз или встретиться много раз.
? — ноль или одно число вхождений символа в строку.
[[:digit:]]?— цифра может встретиться один раз или не встретиться совсем.
Логическое ИЛИ
m|n — соответствует одному из символов n или m.
красн(ая) | (ое) — красная или красное, но не красный
Comments ( 0 )