ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

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

Строковые функции PHP. Конкатенация строк PHP

Строковые функции

Строки являются основными переменными в РНР, они выступают основными посредниками при операциях с файлами и базами данных, с браузерами и серверами. Можно сказать, что работа со строками — это основная задача РНР. Строки в PHP — одни из самых универсальных объектов и работа со строками при решении задач, связанных с веб-сайтами, является весьма приоритетной. Как мы уже видели, любой, сколь угодно сложный объект можно упаковать в строку. Строка может содержать абсолютно любые символы с кодами от 0 до 255 включительно. Нет никакого специального маркера "конца строки". А значит, длина строки во внутреннем представлении PHP хранится где-то отдельно. Наконец, из-за слабого контроля типов в PHP, строка может содержать (и часто содержит) число, причем с ней можно работать, как с числом: прибавлять другие числа, умножать и т. д. При этом все преобразования (в десятичной системе) производятся автоматически. Существуют также функции, преобразующие число, записанное в различных системах счисления (например, в восьмеричной), в обычное представление, и наоборот.

Строковые значения должны быть заключены в двойные или одинарные кавычки. Вид кавычек в РНР, в отличие от JavaScript, играет важную роль.

Двойные и одинарные кавычки PHP

В двойных кавычках помимо обычных видемых и служебных символов могут находиться имена переменных (идентификаторы, начинающиеся с символа $), а также теги HTML. При выводе таких строк на экран с помощью оператора echo интерпретатор РНР заменяет идентификаторы переменных их значениями, а теги HTML интерпретируются браузером.

В браузере служебные символы, такие как \n (перевод строки) и \t (табуляция), не выполняют своей функции, но отображаются в виде пробела.

Если строковое значение заключено в одинарные кавычки, то служебные символы отображаются в виде пар \n, \t и т.д. При этом теги HTML интерпретируются браузером.

Пример:

<?php
$x="Привет";
$y="$x всем!";
$z='$x всем!';
echo $y; //вывод: Привет всем!
echo '<br>';
echo $z; //вывод: $x всем!
?>

Длинные последовательности символов, которые в текстовом редакторе занимают нескодько строк, можно задать с помощью так называемого heredoc-синтаксиса, не используя кавычек:

Переменная = <<<Метка
текст
Метка;

Пример:

<?php
$x=<<<MYDIN
<!-- где, MYDIN-МЕТКА-->
Широка
страна моя
родная!
MYDIN;
echo $x; /*вывод: Широка страна моя родная!*/
?>

В окне веб-браузера это будет выглядеть ТАК.

При работе с модулем РНР CLI (с интерфейсом командной строки) текст на экране будет иметь такое же расположение, что и между метками в РНР-коде. В окне браузера он будет отображен в виде одной или нескольких строк в зависимости от ширины клиентской области браузера. При этом части текста, расположенные в РНР-коде в различных строках, будут отображаться в одной строке через пробел.

Рассмотренный выше пример в окне браузера отображается точно так же, как и следующий код:

<?php
$x="
Широка
страна моя
родная!
"
;
echo $x;
?>

В окне веб-браузера это будет выглядеть ТАК.

Внимание! При использовании heredoc-синтаксиса небходимо соблюдать следующие правила:

  • за первым идентификатором метки не должно быть ни каких символов, в т.ч. и пробелов;
  • за заключительным идентификатором метки должен находится единственный символ точки с запятой.

Чтобы в строке, обрамленной двойными кавычками, отключить интерпретацию таких служебных символов, как двойные кавычки и $, перед ними следует указать обратный слэш(\).

Пример:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Двойные и одинарные кавычки</title>
</head>

<body>
<?php
$x=5;
echo "Роман А.Н. Толстого \"Война и мир\"";
echo '<br>';
echo "\$x=$x";
echo '<br>';
echo "\$x='$x'";
echo '<br>';
echo "$x=$x";
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Cтроки в одинарных кавычках храняться как есть, за исключением пары \', которая хранится как символ апострофа(одинарная кавычка). В строках могут встречаться теги HTML, которые позволяют отформатировать выводимый текст, а также выполнить другие действия. Интерпретатор РНР не интерпретирует их, а сохраняет как есть.

С помощью оператора echo они направляются браузеру, который выполняет соответствующий HTML-код. Поскольку внутри HTML-кода могут использоваться кавычки различных видов, при формировании строк в РНР следует быть внимательным, чтобы правильно их расставлять и сочетать друг с другом.

Конкатенация строк PHP

Самая, пожалуй, распространенная операция со строками — это их конкатенация, или присоединение к одной строке другой. Для конкатенации строк ввели специальный оператор "." (точка).

Пример:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Cклейка строк</title>
</head>

<body>
<?php
$a= "Широка";
$b= $a." страна";
$b="$a страна";
$b.=" моя родная!";
echo $b;
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Оператор "." всегда воспринимает свои операнды как строки и возвращает строку. В случае, если один из операндов не может быть переведен в строковое представление, т. е. если это массив или объект, то он воспринимается как строки array и object соответственно. Вообще говоря, это правило применимо не только при сцеплении строк, но и при передаче такого операнда в какую-нибудь стандартную функцию, которой требуется строка.

Например, следующие команды выведут слово array:

<?php
$a=array(10,20,30);
echo $a // array
?>

Есть и другой, более специализированный, способ конкатенации строк. Он обычно используется, когда значения строковых или числовых переменных перемежаются с обычными словами. Если, к примеру, у нас в $day хранится текущее число, в $month — название месяца и в $year — год, то вывести строку вида "Сегодня 8 января 2009 года" можно так:

<?php
$day=8;
$month=" января";
$year=2009;
echo "Сегодня $day $month $year года";
?>

При этом в строку, вырабатываемую инструкцией echo, автоматически в нужных местах вставятся значения наших переменных. Это позволяет констатировать тот факт, что в PHP все переменные начинаются с $.

Преобразование строк PHP

Для преобразования символьных строк в РНР имеется большое количество встроенных функций. Здесь мы рассмотрим лишь несколько наиболее важных из них.

  • strlen(строка) — возвращает длину строки(количество символов), указанной в качестве параметра. При этом служебные символы, такие как перевод строки, табуляция и др., также будут подсчитаны. Например, строка "Привет, всем!" может быть набрана в РНР-коде по разному, что может сказаться на ее длине, хотя все варианты при этом отображаться одинаково:
  • <?php
    $x="Привет, всем!";
    strlen($x); //возвращает 13
    echo strlen($x);
    echo "<br>";
    $x="Привет,
    всем!"
    ;
    strlen($x); //возвращает 15
    echo strlen($x);
    ?>

    Здесь во втором варианте присваивания значения переменной $x после запятой присутствует невидимый служебный символ перевода строки, который в действительности состоит из двух символов, а перед словом "всем" нет ни одного пробела( в первом варианте есть пробел). Не трудно подсчитать, что 13-1+2=14. Данное обстоятельство следует учесть, если вам потребуется написать какой-нибудь код анализа текстовых строк.

  • trim(строка) — удаляет из строки и начальные и конечные пробелы;
  • ltrim(строка) — удаляет строки начальные пробелы;
    rtrim(строка) — удаляет из строки конечные пробелы;

    Пример:

    <?php
    $a = trim(" Hello, world! ");
    echo $a;
    ?>

    Чтобы убедиться, что эта функция нас не обманывает, выведем ее длину до и после удаления из нее пробелов.

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="utf-8">
    <title>Строковая функция trim </title>
    </head>

    <body>
    <?php
    $a= " Hello, world! ";
    $a1 = trim(" Hello, world! ");
    $str_len = strlen($a);
    $str1_len = strlen($a1);
    echo " Размер исходной строки '$a' = $str_len, <br>
    размер строки после удаления пробелов = $str1_len"
    ;

    ?>
    </body>
    </html>

    В окне веб-браузера это будет выглядеть ТАК.

  • strstr (строка, символ) — возвращает часть строки, начиная с указанного символа и до конца строки. Если строка не найдена, то возвращается false.
  • <?php
    $url = "http://sevidi.narod.ru";
    $www = strstr($url,"s"); //возвращает sevidi.narod.ru
    echo $www;
    ?>
  • strchr(строка, символ) — работает эдентично функции strstr().
  • <?php
    $url = "http://sevidi.narod.ru";
    $www = strchr($url,"s"); //возвращает sevidi.narod.ru
    echo $www; ?>
  • stristr(строка, символ) — функция работает абсолютно аналогично функции strstr(), только является нечувствительной к регистру.
  • strrchr(строка, символ) — возвращает часть строки, начиная с указанного символа и до конца строки. Если строка не найдена, то возвращает false. В отличии от strstr() поиск символа ведется от конца строки.
  • <?php
    $url = "http://sevidi.narod.ru";
    $www = strrchr($url,"s");
    echo $www;
    ?>
  • strpos(строка1, строка2) — возвращает позицию первого вхождения второй строки в первую. Если строка не найдена, то возвращается false. Нумерация позиций начинается с нуля и производится слева направо.
  • <?php
    $a = "Из далека долго, течет река Волга.";
    $a1=strpos($a,"течет"); //возвращает 17
    echo $a1 ;
    ?>
  • strrpos(строка1, строка2) — возвращает позицию последнего вхождения второй строки в первую. Если строка не найдена, то возвращается false. Нумерация позиций начинается с нуля и производится слева направо.
  • <?php
    $a = "Из далека долго, течет река Волга, течет ...";
    $a1=strrpos($a,"течет"); //возвращает 35
    echo $a1 ;
    ?>
  • substr(cтрока, число1, число2) — возвращает подстроку начинающуюся с позиции число1 и длиной число2. Нумерация позиций начинается с нуля.
  • <?php
    $a = "Из далека долго, течет река Волга, течет ...";
    $a1= substr($a,9,24); //возвращает долго, течет река Волга
    echo $a1 ;
    ?>
  • str_replace(строка1, строка2, строка) — заменяет в строка все вхождения в строка 1 на строка2. В качестве заменяемой и замещающих строк могут быть не только видимые символы, но и символы табуляции, конца строки и файла.
  • <?php
    $a = "Из далека долго, течет река Волга, течет ...";
    $a1= str_replace( "долго", "река" , $a); /*возвращает Из далека река, течет река Волга, течет*/
    echo $a1 ;
    ?>
  • strtr(строка, строка1, строка2) — заменяет в строка каждое вхождение любого символа из строка1 на соответствующий ему символ в строка2. Если строка1 и строка2 имеют различные длины, то лишние символы в более длинной строке не используются.
  • <?php
    $a = "<b> Из далека долго, течет река Волга, течет ...</b>";
    $a1= strtr($a, "<b>", "<i>" ); //замена символа <b> на символ <i>
    echo $a1 ;
    ?>
  • str_repeat(строка, число) — повторяет указанную строку заданное количество раз и возвращает ее.
  • <?php
    $a1= str_repeat("долго ", 4 ); //возвращает долго долго долго долго
    echo $a1 ;
    ?>
    >strrev(строка) — производит реверс строки. Возвращает указанную строку, заменив порядок следования символов на противоположный.
    <?php
    $a1= strrev("долго "); //возвращает оглод
    echo $a1 ;
    ?>

Работа с символами PHP

Строки по своей сути являются массивами символов, завершающихся нулевым символом, поэтому к любому символу строки можно обратиться по его индексу, который начинается с 0:

$str[0], $str[1], . . . , $str[n];

Пример:

<?php
$str = "Из далека долго, течет река Волга, течет ...";
echo $str[0]."<br>";//выводит: И
echo $str[1]."<br>";//выводит: з
echo $str[2]."<br>";//выводит: (пробел)
echo $str[3]; //выводит: д
?>

Некоторые базы данных формируют отчет или дамп базы данных, размещая периодически через определенное число строк символы перевода страницы(символ с кодом 12 из таблицы ASCII-кодов), что затрудняет автоматическую обработку таких данных. проблему можно решить, если заменить этот символ переводом строки, используя ранее рассмотренную функцию str_replace(). Но символ перевода страницы не так просто набрать с клавиатуры. В Windows символы перевода страницы предваряют символом возврата каретки — \r.

Для решения таких задач в РНР введена функция chr(), которая возвращает символ по его ASCII-коду и имеет следующий синтаксис:

chr (параметр_ ascii)

Пример:

<?php
$text = "Из далека долго, течет река Волга, течет ...";
$str=str_replace(chr(36), "\n", $text);/*выводит: Из далека долго, течет река Волга, течет ...*/
echo $str. "<br>";
$ctr=chr(36);// выводит: $
echo $ctr;
?>

В файлах могут быть различные управляющие символы, не воспроизводимые редактором. Для определения их значения используется функция ord(), которая возвращает ASCII-код символа:

ord(значение)

Если в значение содержится более одного символа, ASCII-код будет возвращен только для первого.

Пример:

<?php
$str=ord('$');//выводит 36
echo $str;
?>

Еще одной функцией, позволяющей получить статистическое распределение символов в строке, является функция count_chars().

count_chars(строка [, int mode]) — подсчитывает количество вхождений каждого из символов с ASII кодами в диапазоне (0..255) в строку строка и возвращает эту информацию в различных формата. Необязательный аргумент mode по умолчанию равен 0. В зависимости от его значения возвращается:

  • 0 — массив, индексами которого являются ASCII коды, а значениями — число вхождений соответствующего символа.
  • 1 — то же, что и для 0, но информация о символах с нулевым числом вхождений не включается в массив.
  • 2 — то же, что и для 0, но в массив включается информация только о символах с нулевым числом вхождений.
  • 3 — строка, состоящая из символов, которые входят в исходую строку хотя бы раз.
  • 4 — строка, состоящая из символов, которые не входят в исходую строку.

Пример:

<?php
$str = "Из далека долго, течет река Волга, течет ...";
$result=count_chars($str, 0);
for($i=0; $i<count($result); $i++) {
if($result[$i]!=0)
echo "\"" , chr($i) , "\"<pre> встречается в строке $result[$i] раз(а).\n";
}
?>