Php как первый язык программирования. PHP - Что такое РНР. Раствор, который «скрепляет» интернет

Php как первый язык программирования. PHP - Что такое РНР. Раствор, который «скрепляет» интернет

07.03.2019

Поиск первого вхождения символа в строку.

Синтаксис:

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"

Работать будем в два цикла:

    1. Первый будет выполнять проход по всей строке, и искать местоположение первой буквы искомой строки ("lo" ).
    2. Второй, начиная с найденной позиции первой буквы – сверять, какие буквы стоят после неё и сколько из них подряд совпадают.

Проиллюстрируем поиск подстроки в строке:

На первых двух итерациях цикла сравниваемые буквы не будут совпадать (выделено красным). На третьей итерации искомая буква (первый символ искомого слова) совпала с символом в строке, где происходит поиск. При таком совпадении в работу включается второй цикл.

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

На третьей итерации совпал только первый символ искомой строки, а вот второй уже не совпадает. Придется первому циклу продолжить работу. Четвертая итерация дает необходимые результаты – совпадают все символы искомой строки с частью исходной строки. А раз все символы совпали – подстрока найдена. Работу алгоритма можно закончить.

Посмотрим, как выглядит классический код поиска подстроки в строке в С++:

Поиск подстроки в строке

#include // Функция для поиска подстроки в строке // + поиск позиции, с которой начинается подстрока int pos(char *s, char *c, int n) { int i, j; // Счетчики для циклов int lenC, lenS; // Длины строк //Находим размеры строки исходника и искомого for (lenC = 0; c; lenC++); for (lenS = 0; s; lenS++); for (i = 0; i <= lenS - lenC; i++) // Пока есть возможность поиска { for (j = 0; s == 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; for (i = 1; n != -1; i++) { n = pos(s, c, i); if (n >= 0) std:: cout << n << std:: endl; } }

#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 .

Поиск подстроки в строке С++



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows