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

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

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

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

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

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

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

Сравнение строк. Сопоставление и замена подстрок

Сравнение строк

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

Упорядочение строк: функции strcmp (), strcasecmp (), strnatcmp ()

Функции strcmp (), strcasecmp (), strnatcmp () служат для упорядочения строк, которое может понадобиться при сортировке данных.

Протитип функции strcmp () имеет следующий вид:

int strcmp (string str1, string str2);

Функция принимает две строки, которые и сравнивает. Если они равны, функция возвращает значение 0. Если в лесикографическом порядке str1 следует (или больше чем) за str2, функция strcmp () вернет число больше 0. Если str1 меньше строки str2, функция strcmp () вернет число меньше 0. Эта функция чувствительна к регистру.

Функция strcasecmp() идентична предыдущей за исключением того, что она не чувствительна к регистру.

Функция strnatcmp () и ее нечувствительный к регистру аналог srtnatcasecmp () появились в РНР 4. Эти функции сравнивают строки в соответствии с "естественным упорядочением", которое более привычно для человека. Например, strcmp() расположила бы строку "2" после строки "12", поскольку лексикографически она больше. Функция strnatcm() расположила бы эти строи в обратном порядке.

Проверка длины строки с помощью функции strlen ()

Длину строки можно проверить с помощью функции strlen (). Если передать этой функции строку, она вернет ее длину. Например, strlen("hello") возвращает значение 5.

Эту функцию можно задействовать при проверке правильности вводимых данных. Давайте рассмотрим адрес электронной почты в создаваемой форме, хранящийся в переменой Semail. Один из основных способов проверки правильности адреса электронной почты, хранящегося в переменной email — проверка его длины. Есть мнение, что минимальная длина адреса электронной почты равна шести символам — например, если полный адрес содержит код страны без какого-либо домена второго уровня, однобуквенное имя домена и однобуквенный адрес электронной почты, он может иметь вид a@a.to. Следовательно, программа могла бы генерировать сообщение об ошибке, если длина адреса оказывается меньше этого значения:

if (strlen ($email) < 6 )
{
echo 'Этот адрес электронной почты не является допустимым';
//Завершение выполнения сценария
exit;
}
else echo 'Ваше сообщение отправлено';

Внесите изменения в сценарий process.php. Откройте страницу с формой и протестируйте скрипт.

Это предельно упрощенный способ проверки правильности информации. Более реалистичный способ будет рассмотрен дальше.

Сопоставление и замена подстрок

На практике часто возникает необходимость проверить наличие конкретной подстроки в более длинной строке. Обычно такое частичное сопоставление приносит больше пользы, чем проверка строк на предмет полного совпадения.

В примере с интелектуальной формой отправки электронной почты требуется выполнить поиск ключевых фраз в данных обратной связи, поступающих от пользователей, и отправить сообщение электронной почты в соответствующее подразделение компании АВС. Если мы хотим направлять сообщения электронной почты, в которых речь идет о магазинах запчастей, менеджеру розничной продажи, требуется знать, встречается ли в этих сообщениях слово "магазин" или его производные.

Располагая уже рассмотренными функциями, можно было бы использовать функции explode() или strtok() для получения отдельных слов сообщения, а затем сравнить их, используя операцию == или функцию strcmp().

Однако, это же можно сделать с помощью единственного вызова к одной из функций сопоставления строк или регулярных выражений. Эти функции используются для поиска определенной последовательности внутри строки. Мы рассмотрим каждый из наборов функций по отдельности.

Поиск строк в строках: функции strstr (), strchr (), strrchr (), stristr ()

Для поиска строки внутри другой строки можно использовать любую из функций strstr (), strchr (), strrchr (), stristr ().

Функция strstr() является наиболее общей и может использоваться для поиска соответствующей строки или символа внутри более длинной строки. Следует отметить, что в РНР функция strchr () полностью совпадает с функцией strstr(), хотя ее имя предполагает, что она применяется для поиска символа в строке. В РНР любая из этих функций может использоваться для поиска строки внутри строки, в том числе для поиска строки, состоящей только из одного символа.

Функция strstr() имеет следующий прототип:

string strstr (string haystack, string needle);

В качестве параметра функции передается строка haystack, в которой нужно выполнить поиск, и строка needle, которую требуется найти. В случае обнаружения полного соответствия со строкой needle функция возвращает часть строки haystack, начинающуюся со строки needle; в противном случае она возвращает значение false. Если строка needle встречается более одного раза, возвращаемая строка будет начинаться с первого вхождения сроки needle.

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

$toaddress = 'abcfeedback@abc.ru'// значение по умолчанию
// Изменение переменной $toaddress при соответствии критериям
if (strstr($feedback, "магазин"))
$toaddress = "abcretail@abc.ru";
else if (strstr($feedback, "получил"))
$toaddress = "absaccounts@abc.ru";
else if (strstr($feedback, "abc"))
$toaddress = "abcaccounts@abc.ru";

Этот код выполняет проверку отзыва на предмет наличия определенных ключевых слов и отправляет сообщение электронной почты соответствующему лицу. Если, например, отзыв клиента звучит как "Я все еще не получил последний заказ", в нем будет найдена строка "получил", и отзыв будет отправлен по адресу absaccounts@abc.ru.

Существует два варианта функции strstr(). Первый — функция strist (), которая пракчески идентична предыдущей, но не чувствительна к регистру. Это удобно в данном приложении, поскольку клиент мог бы ввести "получил", "Получил" или "ПОЛУЧИЛ".

Второй вариант — функция strrchr(), которая также почти идентична функции strstr(), но будет возвращать часть строки haystack, начиная с последнего вхождения строки needle.

Определение позиции подстроки: функции strpos () и strrpos ()

Функции strpos () и strrpos() действуют аналогично функции strstr() за исключением того, что вместо подстроки они возвращают числовую позицию строки needle внутри строки haystack.

Функция strpos() имеет следующий прототип:

string strpos(string haystack, string needle [, int offset );

Целочисленное возвращаемое значение представляет первое вхождение строки needle внутри строки haystack. Как обычно, первый символ занимает нулевую позицию.

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

$test = 'Привет всем на нашем сайте!';
echo strpos ($test, 'е');

В данном случае в качестве строки needle был передан единственный символ, но ею может быть строка любой длины.

Необязательный параметр offset используется для указания позиции внутри строки haystack, с которой должен начинаться поиск. Например,

echo strpos ($test, 'в', 4);

Этот код выведет в окне браузера значение 7, поскольку РНР начинает поиск символа "в" с четвертой позиции и, следовательно, не видит этот символ в третьей позиции (считая от нуля).

Функция strrpos() действует почти так же, но будет возвращать позицию последнего вхождения строки needle в строке haystack. В отличие от функции strpos (), эта функция работает только с одно-символьной строкой needle.

В любом из этих случаев, если needle не является строкой, функция strpos() или strrpos () будет возвращать значение false. Это может порождать проблемы, поскольку в слабо типизированном языке наподобие РНР значение false эквивалентно 0, т.е., первому символу в строке.

Во избежание этой проблемы можно использовать операцию === для проверки возвращаемых значений:

$test = 'Привет всем на нашем сайте!';
$result = strpos ($test, 'р');
if ($result === false)
echo 'Не найдено';
else
echo "Найдено в позиции $result";

Обратите внимание, что этот метод подходит только для РНР 4 — в предшествующих версиях эту проверку можно выполнить, проверяя, является ли возвращаемое значение строкой (т.е., значением false).

Замена паодстрок: функции str_replace () и substr_replace ()

Функциональные возможности поиска и замены могут оказаться исключительно полезными и при работе со строками. Ранее мы уже использовали поиск и замену для персонификации документов, сгенерированных РНР, например, заменяя «name» именем конкретного лица, a «address» — его адресом. Эти функции можно использовать также для цензуры определенных терминов, например, в приложении дискуссионного форума или даже в нашем приложении интеллектуальной формы отправки электронной почты.

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

Чаще всего для замены применяется строковая функция str_replace (). Она имеет следующий прототип:

mixed str_replace (mixed needle, mixed new_needle, mixed haystack [, int &count]);

Эта функция заменяет все экземпляры строки needle в строке haystack на строку new_needle и возвращает новую версию haystack.

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

Например, поскольку некоторые клиенты могут использовать приложение интеллектуальной формы отправки электронной почты для выражения своего недовольства, они могут прибегнуть к некоторым довольно выразительным словам. Будучи программистом, вы легко можете оградить персонал различных подразделений компании от всякого рода оскорблений за счет использования массива $offcolor, который содержит слова подобного рода. Ниже показан пример вызова функции str_replace () с передачей ей такого массива.

$feedback = str_replace ($offcolor, '%!@*', $feedback);

Например:

$feedback = 'Дураки вы все!';
$offcolor = array ("Дураки");
$feedback = str_replace ($offcolor, '%!@*', $feedback);
echo $feedback;

Функция substr_replace () используется для поиска и замены конкретной подстроки на основе ее позиции в строке. Она имеет следующий прототип:

string substr_replace (string needle, string replacement, int start [, int length]);

Эта функция заменяет часть строки string строкой replacement. Какую именно часть — зависит от значений параметра start и от необязательного параметра length.

Значение параметра start представляет собой смещение, с которого начинается замена. Если оно является нулевым или положительным, смещение определяется относительно начала строки, если же оно отрицательно, то смещение определяется относительно конца строки. Например, приведенная ниже строка кода будет заменять последний символ в переменной $test символом "?":

$test = 'Привет всем на нашем сайте!';
$test = substr_replace ($test, '?', -1);
echo $test;

Параметр length является необязательным и задает позицию, в которой РНР прекращает замену. Если это значение не указано, замена производится с позиции, определенной параметром start, и до конца строки.

Если значение параметра length равно нулю, строка замены фактически будет вставлена в строку без перезаписи существующей строки.

Положительное значение параметра length означает количество символов, которые должны быть заменены новой строкой, тогда как отрицательное значение представляет позицию относительно конца строки, начиная с которой замена символов прекращается.