Строка (тип string) - это набор символов, где символ - это то же самое, что и байт. Это значит, что PHP поддерживает ровно 256 различных символов, а также то, что в PHP нет встроенной поддержки Unicode.
Простейший способ определить строку - это заключить её в одинарные кавычки (символ
'
). Чтобы использовать одинарную кавычку внутри строки, проэкранируйте её обратным слешем (
\
). Если необходимо написать сам обратный слеш, продублируйте его (
\\
). Все остальные случаи применения обратного слеша будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как
\r
или
\n
, они будут выведены как есть вместо какого-либо особого поведения.
Давайте рассмотрим частые примеры работы со строками в PHP.
Строковые операторы
Основными строковыми операторами являются конкатенация и присваивание с конкатенацией.
Конкатенация строк
Данные оператор позволяет объединить две и более строк в одну.
$str1 = 'У лукоморья дуб зелёный;';
$str2 = 'Златая цепь на дубе том';
$str = $str1 . ' ' . $str2; //Объединяем (склеиваем) 3 строки $str1, пробел и $str2
var_dump($str);
Результат:
string(87) "У лукоморья дуб зелёный; Златая цепь на дубе том"
Присваивание с конкатенацией
Этот оператор позволяет "приклеить" строки более короткой записью. Изменим вышеуказанный пример:
$str1 = 'У лукоморья дуб зелёный;';
$str2 = 'Златая цепь на дубе том';
$str .= $str1;
$str .= ' ';
$str .= $str2;
var_dump($str);
Результат тот же самый:
string(87) "У лукоморья дуб зелёный; Златая цепь на дубе том"
Данный пример может не очень хорошо отражает удобство этого метода. Но представьте что у вас есть массив строковых значений и вам нужно проверить его элементы и при определённых условиях собрать из них строку.
$str = '';
$arr = [
'Строка 1 ',
'Строка 2 ',
'Строка 3 ',
'Строка 4 ',
'Строка 5 '
];
foreach($arr as $item) {
//некоторая проверка
$str .= $item;
}
var_dump($str);
Результат:
string(75) "Строка 1 Строка 2 Строка 3 Строка 4 Строка 5 "
Таким образом частом складывают SEO заголовок страницы фильтра в каталоге. Если посетитель отфильтровал каталог по ряду свойств, можно создать заголовок из заголовка раздела, названия и значения свойств.
Подсчёт символов в строке
Рассмотрим функции позволяющие сосчитать символы в строке.
Получить длину строки
Для этого используется функция
strlen()
принимающая саму строку, возвращает целое число, количество всех символов в строке. Если в строке есть кирилические символы в кодировке UTF-8, функция вернёт не правильный результат. Чтобы получить верную длину строки для кириллицы, используйте функцию
mb_strlen()
.
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том';
echo strlen($str) . '<br/>';
echo mb_strlen($str) . '<br/>';
Результат:
87
48
Вообще для работы со строками в UTF-8 есть целый набор функций с префиксом
mb
.
Количество символов без пробелов
Тут придётся вначале подготовить исходную строку, путём замены пробелов на пустую строку функцией
mb_ereg_replace()
.
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том';
//заменяем в строке все пробелы
$str = mb_ereg_replace('[\s]', '', $str);
//Считаем поличество символов
echo mb_strlen($str);
Количество слов в строке
$str = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';
//Считаем количество слов в строке
$count = str_word_count($str);
var_dump($count); // вернёт 8
Функция str_word_count() не работает с кириллицей по умолчанию и не имеет "двойника" с префиксом mb_. Чтобы это исправить, нужно передать дополнительные аргументы, формат возвращаемых данных равный 2, в этом случае функция вернёт массив, а третий аргумент, строка с русским алфавитом в разном регистре.
//Не работает без доп.параметров для строк с кириллицей
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том';
//Считаем количество слов в строке, результат будет в виде массива отдельных слов
$arr = str_word_count($str, 2, 'АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя');
//Считаем количество элементов в массиве
$count =count($arr)
var_dump($count); //вернёт 9
Количество переносов в строке
Тут потребуется функция
substr_count()
которая считает количество вхождений подстроки, в исходную строку. В качестве подстроки будем использовать
PHP_EOL
.
PHP_EOL
это константа принимающая значения корректного символа конца строки (переноса) на текущей платформе, где выполняется php скрипт.
$str = 'У лукоморья дуб зелёный;
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом;';
echo substr_count($str, PHP_EOL); // вернёт 3
Количество букв в строке
Опять таки исходная строка требует внесения предварительных изменений.
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
//Оставляем только буквы в строке
echo $str = preg_replace('/[^a-zа-яё]/ui', '', $str);
//Считаем количестсво букв
echo mb_strlen($str); // вернёт 39
Количество цифр в строке
Аналогично предыдущему примеру, только теперь регулярное выражение заменит всё, что не является цифрой, на пустую строку.
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
//Оставляем только буквы в строке
echo $str = preg_replace('/[^0-9]/ui', '', $str);
//Считаем количестсво букв
echo mb_strlen($str); // вернёт 0
Количество знаков препинания
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
//Оставляем только буквы в строке
echo $str = preg_replace('/[^[:punct:]]/', '', $str);
//Считаем количестсво букв
echo mb_strlen($str); // вернёт 2
Количество пробелов в строке
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
echo substr_count($str, ' '); //Вернёт 8
Поиск по строке
Рассмотрим различные методы поиска в строке.
Получить количество определённых слов в строке
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
echo mb_substr_count($str, 'Златая'); // 1
Есть зависимость от регистра, т.е. вот так функция ничего не найдёт:
echo mb_substr_count($str, 'златая'); // 0
Позиция первого вхождения подстроки в строку
Тут есть функция позволяющая игнорировать регистр символов
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
//С учётом регистра
echo mb_strpos($str, 'Златая'); // 25
// Без учета регистра
echo mb_stripos($str, 'златая'); // 25
Позиция последнего вхождения подстроки в строку
Так же можно игнорировать регистр
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
//С учётом регистра
echo mb_strrpos($str, 'дуб'); // 40
// Без учета регистра:
echo mb_strrpos($str, 'дуб'); // 40
Найти все вхождения подстроки
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
$offset = 0;
$allpos = [];
while (($position = mb_strpos($str, 'дуб', $offset)) !== false) {
$offset = $position + 1;
$allpos[] = $position;
}
echo '<pre>';
print_r($allpos);
echo '</pre>';
Результат:
Array
(
[0] => 12
[1] => 40
)
Обратите внимание на сравнение !== false, это сделано для того, чтобы учесть подстроку, если она будет в начале строки и её позиция будет равна 0. Такое сравнение позволяет исключить приведение 0 к false, что привело бы к логической ошибке.
Замена в строках
Функция
substr_replace($search, $replace, $subject, $count)
заменяет часть
$search
строки
$subject
на
$replace
. Она также не раотает с кирилицей в кодировке UTF-8, в библиатеке
mb_string
её нет, поэтому нам потребуется написать свой аналог:
/**
* @param $original
* @param $replacement
* @param $position
* @param $length
* @return string
*/
function mb_substr_replace($original, $replacement, $position, $length){
$startString = mb_substr($original, 0, $position, 'UTF-8');
$endString = mb_substr($original, $position + $length, mb_strlen($original), 'UTF-8');
$out = $startString . $replacement . $endString;
return $out;
}
Замени часть строки
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
//Ищем подстроку "зелёный" и заменяем её на "красный"
var_dump(mb_substr_replace($str, 'красный', mb_strpos($str, 'зелёный'), mb_strlen('зелёный')));
Результат:
string(88) "У лукоморья дуб красный; Златая цепь на дубе том:"
Замена символов и слов в строке
В php есть функция
str_replace($search, $replace, $subject)
которая будет сама осуществлять поиск вхождения, расчёт длины строки и при этом, она будет работаь со всеми кодировками.
Замена пробелов в строке
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
echo str_replace(' ', '*', $str); // У*лукоморья*дуб*зелёный;*Златая*цепь*на*дубе*том:
Замена до определённого символа
//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';
$str = 'Зелёный дуб у лукоморья' . mb_substr($str, mb_strpos($str, '; '), -1);
echo $str; //Зелёный дуб у лукоморья; Златая цепь на дубе том
Собственно все операции со строками крутятся вокруг десятка функций, которые позволяют найти подстроки, полуить их позицию и длину, а дальше можно модифицировать строки, склеивать из них другие строки, удалять ненужное (так например работают фильтры ненормативной лексики).