Our Blog

Работа с строками в PHP

В Интернете часто приходится проводить манипуляцию со строками. По этой причине необходимо знать и уметь использовать встроенные функции 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";
// Выведет &quot;Boлгa&quot; , &quot;Mocквич&quot;

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);
&#65279;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++) {
   &#65279;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 )
    -->