Использование строк без представления о том, что в них содержится, немного похоже на ночную езду на автомобиле с выключенными фарами — вы знаете, что дорога должна быть где-то здесь, но не можете знать этого точно. РНР предлагает широкий спектр функций для поиска и замены текста внутри строк с использованием как традиционного подхода "поиска и замены", так и специальной системы, известной под названием регулярных выражений, которая будет описана далее в этой книге. Простейшая форма поиска состоит в нахождении подстроки в строке. Эта задача обычно выполняется вызовом функции strpos ($haystack, $needle [, $start]), которая возвращает false, если $needle не может быть найдено в $haystack; в противном случае функция возвращает позицию первого символа $needle внутри $haystack. Если указан целочисленный параметр $ s t a r t , операция поиска выполняется, начиная с символа $haystack, положение которого соответствует $start. Например, следующий сценарий возвращает "Строка найдена в позиции 24":
$haystack = 'Трое в лодке, не считая собаки1; $pos = strpos ($haystack, 'собаки'); if ($pos === false) echo "Строка не найдена\п"; else echo "Строка найдена в позиции $pos\n"; ?>
Имеется одна очень существенная деталь, которую следует отметить о приведенном выше сценарии. Чтобы определить, был ли вызов strpos () успешным и вхождение подстроки 'собаки' присутствует внутри $haystack, значение $pos сравнивается с false с помощью операции проверки равенства с контролем типов ===. Причина этого состоит в том, что булевское значение false равно целочисленному нулю. Однако strpos () возвратит ноль, если искомый фрагмент $needle будет найден, начиная с первого символа $haystack. Таким образом, проверка значения, возвращаемого strpos () с помощью выражения вроде:
if (!strpos ($haystack, $needle)) die ("Сбой");
может привести к неожиданной проблеме. Например, следующий сценарий неверно выдаст, что строка ' Трое' не может быть найдена внутри строки ' Трое в лодке':
$haystack = 'Трое в лодке'; $pos = strpos ($haystack, 'Трое'); if (!$pos) echo "Строка не найдена\п"; else echo "Строка найдена в позиции $pos\n"; ?>
Несмотря на то, что strpos О выполняет поиск слева направо, можно начать поиск с конца строки и двигаться к началу с помощью функции strrpos (). В отличие от strpos (), однако, strrpos () может искать только один символ. Если вы укажете строку с более чем одним символом в параметре $needle, будет принят во внимание только первый символ. Как и можно было представить, strpos () является функцией, чувствительной к регистру, а поэтому, например, не найдет слово ' трое' в предыдущем примере. Интересно, что не существует нечувствительной к регистру альтернативы strpos (). Однако, в РНР определена функция s t r s t r (), которая похожа на strpos () и имеет нечувствительной к регистру аналог по имени s t r i s t r (). В отличие от strpos (), s t r s t r () возвращает часть $haystack, которая начинается с $needle. Следующий сценарий, например, вернет'Найдена строка: в лодке':
$haystack = 'Трое в лодке'; $pos = strstr ($haystack, 'в лодке1); if (!$pos) echo "Строка не найдена\п"; else echo "Найдена строка: $pos\n"; ?>