Часто возникает необходимость просматривать части строк по отдельности. Например, может потребоваться просмотреть слова и предложения (например, для проверки правописания) или разделить имя домена или адрес электронной почты на соответствующие компоненты. РНР предлагает несколько строковых функций (и одну функцию регулярного выражения), которые позволяют делать это.
В рассматриваемом примере, мы хотим, чтобы все данные обратной связи с клиентом с адресом, например, bigtrail.com поступали непосредственно к руководителю компании. Для этого мы разделим адрес электронной почты, содержащийся в сообщении клиента, на составляющие части, чтобы выяснить, не поступало ли оно от самого крупного заказчика.
Первая функция, explode (), которой можно было бы воспользоваться для этих целей, имеет следующий прототип:
array explode (string разделитель, string исх_строка [, int лимит]);
Эта функция принимает строку исх_строка и делит ее на части по заданной разделительной строке разделитель. Части строки возвращаются в виде массива. Можно ограничить число таких частей с помощью необязательного параметра ограничения лимит.
Чтобы получить имя домена из адреса электронной почты в сценарии, чожно воспользоваться следующим кодом:
$email_array = explode ('@', $email);
В результате этого вызова функции explode () адрес электронной почты делится на две части: имя пользователя, которое сохраняется в $email_array [1]. Теперь можно проверить имя домена, чтобы определить источник сообщения клиента и переадресовать сообщение соответствующему лицу:
if ($email_array [1] == 'bigtrail.com')
$toaddress = '[email protected]';
else
toaddress = '[email protected]';
Если имя домена содержит прописные буквы, показанный подход не работает. Этой проблемы можно избежать, если преобразовать все буквы домена в прописные или строчные, а затем уже выполнить проверку:
$email_array [1] = strtolower ($email_array [1]);
где функция strtolower ($email_array [1]); преобразует символы строки в строчные буквы.
Эффект, противоположный действию функции explode (), достигается с помощью функций implode () или join (), которые идентичны. Например:
$new_mail = implode ('@', $email_array);
Приведенный выше оператор принимает элементы массива $email_array и объединяет их со строкой, переданной в первом параметре. Вызов этой функции во многом подобен вызову explode (), но ее действия противоположны.
В отличии от функции explode (), которая позволяет за один вызов делить на части сразу всю строку, функция strtok () дает возможность получать фрагменты (называемые лексемами) строки, по одному за вызов. Эту функцию следует рассматривать как полезную альтернативу функции explode () при обработке слов из строки по одному за раз.
Прототип функции strtok () вглядит следующим образом:
string strtok (string исх_строка, string разделитель);
В качестве разделителя разделитель можно использовать символ или строку символов, однако следует иметь ввиду, что строка ввода будет разделяться по каждому из символов разделителя, а не по всей строке разделителя.
Вызов функции strtok () не столь прост, как кажется, если судить только по ее прототипу. Для получения первой лексемы из строки нужно вызвать функцию strtok () со строкой, которую требуется разбить на лексемы, и с разделителем. Чтобы получить из заданной строки последующие лексемы, достаточно передать внутренний указатель на позицию разделителя в строке. Если требуется переустановить указатель, необходимо снова передать строку в функцию.
Как правило, функция strtok () используется так, как показано ниже:
$token = strtok ($feedback, ' ');
echo $token. '<br>';
while ($token != ' ')
{
$token = strtok (' ');
echo $token. '<br>';
}
Как обычно, имеет смысл проверить, например, с помощью функции empty (), заполнил ли пользователь некоторые поля в форме.
Приведенный фрагмент кода выводит каждую лексему отзыва клиента в отдельной строке и выполняет цикл, пока лесемы не закончатся.
Для демонстрации работы функции введите в переменную $feedback любой текст.
В окне веб-браузера это будет выглядеть ТАК.
При наличии в исходной строке двух следующих подряд разделителей (в данном примере — двух следующих подряд пробелов) функция strtok() возвращает пустую строку. Ее нельзя отличить от пустой строки, возвращаемой по достижении конца исходной строки. Кроме того, если одной из лексем является 0, функция также вернет пустую строку. В связи с этим РНР-функция strtok() несколько менее полезна чем explode ().
Функция substr() позволяет получить доступ к подстроке между заданными начальной и конечной позициями в строке. Для нашего примера она не подходит, но может оказаться полезной, если требуется разделить на части фиксированные отформатированные строки.
Функция substr() имеет следующий прототип:
string substr (string строка, int начало [, int длина] );
Эта функция возвращает подстроку из строки строка.
Давайте рассмотрим примеры использования следующей тестовой строки:
$test = 'Нам нравится ваше обслуживание';
Если вызвать ее с положительным числом в качестве параметра начало (и ничего больше), мы получим строку, начиная с позиции начало и до конца строки. Например:
substr ($test, 3);
В окне веб-браузера это будет выглядеть ТАК.
Функция возвратит строку нравится ваше обслуживание. Обратите внимание, что нумерация позиций строки начинается с 0, как в массивах.
Если вызвать функцию substr () только с отрицательным значением параметра начало, мы получим строку, состоящую из символов, отсчитываемых с конца строки, длиной, заданной параметром начало. Например оператор:
substr ($test, -12);
возвращает подстроку обслуживание.
В окне веб-браузера это будет выглядеть ТАК.
Параметр длина может использоваться для указания либо количества символов, которые должны быть возвращены (если он положителен), либо последнего символа возвращаемой последовательности (если он отрицателен). Например:
substr ($test, 0, 3);
возвращает первые два символа строки, а именно, подстроку Нам.
В окне веб-браузера это будет выглядеть ТАК.
Следующий код:
echo substr ($test, 3, -12);
возвращает символы расположенные между третьим символом от началаи двенадцатым символом от конца строки, т.е. нравится ваше.
В окне веб-браузера это будет выглядеть ТАК.
Надо иметь ввиду, сто нумерация символов в строке начинается с 0.