Поиск первого вхождения символа в строку.
Синтаксис:
String strchr(string haystack, string needle)
Данная функция работает идентично функции strstr()
Определяет отсутствие начальных символов в строке.
Синтаксис:
Int strcspn(string str1, string str2)
Функция strspn() возвращает длину начального фрагмента строки str1, состоящего полностью не из символов, которые есть в строке str2.
strpbrk()
Поиск в строке любого символа из заданного набора (PHP5)
Синтаксис:
String strpbrk (string haystack, string char_list)
strpbrk() ищет в строке haystack символы из набора char_list и возвращает строку начиная с той позиции, где был найден символ (или FALSE если символ не найден). Параметр char_list чувствителен к регистру.
$text = "This is a Simple text.";
echo strpbrk($text, "mi"); // Выдаст "is is a Simple text.", т.к. символ "i" встретится раньше
echo strpbrk($text, "S");// Выдаст "Simple text.", т.к. символы чувствительны к регистру
?>
Поиск первого вхождения подстроки в строку.
Синтаксис:
String strstr(string haystack, string needle)
Функция strstr() возвращает участок строки, заданной в параметре haystack, начиная с первого фрагмента, указанного в параметре needle и до конца.
$email = "[email protected]";
$domain = strstr($email, "@");
// или$domain = strstr($email, ord("@"))
echo $domain;
// выведет @mail.ru
Нахождение первого вхождения подстроки, не учитывая регистр.
Синтаксис:
String stristr(string haystack, string needle)
Функция stristr() возвращает участок строки, заданной в параметре haystack, начиная с первого фрагмента, указанного в параметре needle и до конца.
В случае неудачи возвращает false.
Данная функция нечувствительна к регистру.
В случае, если needle не является строкой, то значение преобразуется в целое и используется как код искомого символа.
Поиск последнего вхождения подстроки.
Синтаксис:
String strrchr(string haystack, string needle)
Функция strrchr() возвращает участок строки, заданной в параметре haystack, начиная с последнего фрагмента, указанного в параметре needle и до конца.
В случае неудачи возвращает false.
Данная функция чувствительна к регистру.
В случае, если needle не является строкой, то значение преобразуется в целое и используется как код искомого символа.
// получим последний каталог в $PATH
$dir = substr(strrchr($PATH, ":"), 1);
// а здесь получим все после последнего перевода строки$text = "text 1nText2nText3";
echo substr(strrchr($text, 10), 1);
Находит позицию первого вхождения подстроки в заданной строке.
Синтаксис:
Int strpos(string where, string what [, int fromwhere])
Функция strpos() пытается найти в строке were подстроку what и в случае успеха возвращает позицию (индекс) этой подстроки в строке.
Первый символ строки имеет индекс 0. Необязательный параметр fromwhere можно задавать, если поиск нужно вести не с начало строки, а с какой-то другой позиции. В этом случае следует эту позицию передать в fromwhere. Если подстроку не удалось найти, функция возвращает false.
If(strpos($text, "a")===false) echo "Не найдено!";
// Проверка: три знака равенства
Находит позицию первого вхождения подстроки в заданной строке без учета регистра.
Синтаксис:
Int stripos(string where, string what [, int fromwhere])
Функция stripos() пытается найти в строке were подстроку what и в случае успеха возвращает позицию (индекс) этой подстроки в строке.
В отличие от strpos(), эта функция не учитывает регистр символов. Первый символ строки имеет индекс 0.
Необязательный параметр fromwhere можно задавать, если поиск нужно вести не с начало строки, а с какой-то другой позиции.
В этом случае следует эту позицию передать в fromwhere. Если подстроку не удалось найти, функция возвращает false.
Если параметр what не строка, в этом случае его значение преобразуется в целое и используется как код искомого символа.
$mystring1 = "xyz";
$mystring2 = "ABC";
$pos1 = stripos($mystring1, $findme);
$pos2 = stripos($mystring2, $findme);
// Конечно, "a" не входит в "xyz"
if ($pos1 === false) {
echo "Строка "$findme" не найдена в строке "$mystring1"";
}
// Заметьте, что используется ===. Использование == не даст верного
// результата, так как "a" в нулевой позиции.if ($pos2 !== false) {
echo "Нашел "$findme" в "$mystring2" в позиции $pos2";
}
?>
Примечание: Функция stripos() может применяться для поиска данных в двоичной форме.
Поддержка: PHP 5
Находит в заданной строке последнюю позицию, в которой находится заданный фрагмент.
Синтаксис:
Int strrpos(string where, string what)
Данная функция ищет в строке where последнюю позицию, в которой встречался символ what (если what -
строка из нескольких символов, то выявляется только первый из них, остальные не играют никакой роли).
Если искомый символ стоит первый в строке или его вообще нет, функция возвратит 0.
В случае, если искомый символ не найден, возвращает false.
substr_count
Находит количество вхождений фрагмента в строку.
Синтаксис:
Int substr_count(string where, string what)
Функция substr_count() возвращает число фрагментов what, присутствующих в строке where.
Echo substr_count("www.spravkaweb.ru", ".");
// Выведет 3
Определяет присутствие начальных символов в строке.
Синтаксис:
Int strspn(string str1, string str2)
Функция strspn() возвращает длину начального фрагмента строки str1, состоящего полностью из символов, которые есть в строке str2.
Echo strspn("www.spravkaweb.ru", "abc");
// Выведет 3
Сейчас мы разберём на примерах, как может выглядеть алгоритм поиска подстроки в строке. Примеры будут основываться на функциях стандартных библиотек, ведь именно в таких функциях и проявляются все удобства написания программ. А вот классический разбор алгоритма, основанный на циклах и сравнениях, также достаточно примечателен. Поэтому мы его рассмотрим в этом же уроке.
Сам алгоритм в принципе очень прост. Есть две строки. Например "Hello world" и "lo"
Работать будем в два цикла:
- Первый будет выполнять проход по всей строке, и искать местоположение первой буквы искомой строки ("lo" ).
- Второй, начиная с найденной позиции первой буквы – сверять, какие буквы стоят после неё и сколько из них подряд совпадают.
Проиллюстрируем поиск подстроки в строке:
На первых двух итерациях цикла сравниваемые буквы не будут совпадать (выделено красным). На третьей итерации искомая буква (первый символ искомого слова) совпала с символом в строке, где происходит поиск. При таком совпадении в работу включается второй цикл.
Он призван отсчитывать количество символов после первого в искомой строке, которые будут совпадать с символами в строке исходной. Если один из следующих символов не совпадает – цикл завершает свою работу. Нет смысла гонять цикл впустую, после первого несовпадения, так как уже понятно, что искомого тут нет.
На третьей итерации совпал только первый символ искомой строки, а вот второй уже не совпадает. Придется первому циклу продолжить работу. Четвертая итерация дает необходимые результаты – совпадают все символы искомой строки с частью исходной строки. А раз все символы совпали – подстрока найдена. Работу алгоритма можно закончить.
Посмотрим, как выглядит классический код поиска подстроки в строке в С++:
Поиск подстроки в строке
#include
#include // Функция для поиска подстроки в строке // + поиск позиции, с которой начинается подстрока int pos (char * s , char * c , int n ) int i , j ; // Счетчики для циклов int lenC , lenS ; // Длины строк //Находим размеры строки исходника и искомого for (i = 0 ; i <= lenS - lenC ; i ++ ) // Пока есть возможность поиска for (j = 0 ; s [ i + j ] == c [ j ] ; j ++ ) ; // Проверяем совпадение посимвольно // Если посимвольно совпадает по длине искомого // Вернем из функции номер ячейки, откуда начинается совпадение // Учитывать 0-терминатор ("\0") if (j - lenC == 1 && i == lenS - lenC && ! (n - 1 ) ) return i ; if (j == lenC ) if (n - 1 ) n -- ; else return i ; //Иначе вернем -1 как результат отсутствия подстроки return - 1 ; int main () char * s = "parapapa" ; char * c = "pa" ; int i , n = 0 ; n = pos (s , c , i ) ; if (n >= 0 ) std :: cout << n << std :: endl ; |
Два цикла выполняют каждый свою задачу. Один топает по строке в надежде найти “голову” искомого слова (первый символ). Второй выясняет, есть ли после найденной “головы” “тело” искомого. Причем проверяет, не лежит ли это “тело” в конце строки. Т.е. не является ли длина найденного слова на единицу больше длины искомой строки, если учитывать, что в эту единицу попадает нулль-терминатор ("\0" ).
Мы видим, что программа нашла начало подстроки pa в ячейках символьного массива с индексом 0 и 4. Но почему? Ведь в слове parapapa 3 таких подстроки. Все дело в "\0" .
Подробно об этом
Например строки: "Remember Harry number room" и "room" на самом деле выглядят как "Remember Harry number room\0" и "room\0" . Где "\0" , символ с кодом 0, который говорит, что строка закончилась. Кстати именно такой подход и позволяет писать такие циклы как:
for (lenC = 0; c; lenC++); for (lenS = 0; s; lenS++);
for (lenC = 0 ; c [ lenC ] ; lenC ++ ) ; for (lenS = 0 ; s [ lenS ] ; lenS ++ ) ; |
Тут c и s
Если мы хотим найти слово room 5
Дело в том, что символы Си-строк хранятся в символьном массиве. Каждая строка характеризуется так называемым ASCIIZ свойством. Эта аббревиатура буквально переводится как «строка, которая оканчивается символом с кодом равным нулю” – аски-зеро.
Подвох состоит в том, что если искомое находится в самом конце строки, придется учитывать и это зеро. Оно тоже является частью строки, и при таком алгоритме еще и совпадает с концом искомой строки.
Например строки: и на самом деле выглядят как и . Где , символ с кодом 0, который говорит, что строка закончилась. Кстати именно такой подход и позволяет писать такие циклы как:
Тут c и s сравниваются с нулевым значением, и их удобно читать как “Увеличивать счетчик, пока есть (не пустой) символ в строке”. Пустым как раз будет считаться последний символ – зеро.
Если мы хотим найти слово room , стоящее в середине слова, нам нужно сравнивать только 4 символа, но если вдруг искомое встретится только в конце – нам нужно уже сравнивать не 4 символа, а… 5 ! Или проверять, не стоит ли после нуль-терминатор этот. В этом нет ничего сложного. К такой строке нужно просто привыкнуть.
В целом смысл самого алгоритма на этом заканчивается. Больше никаких сложностей кроме нуля в конце строки нет. Однако, следует обратить внимание на множественность поиска. Что, если нам необходимо найти в строке несколько позиций?
Сколько раз искомое слово встречается в строке и в каких местах? Именно это и призван контролировать третий параметр – int n – номер вхождения в строку. Если поставить туда единицу – он найдет первое совпадение искомого. Если двойку, он заставит первый цикл пропустить найденное первое, и искать второе. Если тройку – искать третье и так далее. С каждым найденным искомым словом, этот счетчик вхождений уменьшается на единицу. Это и позволяет описать поиск в цикле:
for (i = 1; n != -1; i++) { n = pos(s, c, i); if (n >= 0) std:: cout << n << std:: endl; }
for (i = 1 ; n != - 1 ; i ++ ) n = pos (s , c , i ) ; if (n >= 0 ) std :: cout << n << std :: endl ; |
То есть найти первое, второе, третье, четвертое совпадение… Пока функция не вернет -1 , что укажет на отсутствие N-ного искомого в строке.
Теперь, для сравнения, поиск подстроки в строке С++ с хедером string .
Поиск подстроки в строке С++