PHP: mb_strpos — Manual

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strpos — Поиск позиции первого вхождения одной строки в другую

Описание

mb_strpos ( string $haystack , string $needle , int $offset = 0 , string|null $encoding = null ) : int|false

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

Список параметров

haystack

Строка string в которой производится поиск.

needle

Строка, поиск которой производится в строке haystack. В отличие от strpos(), числовые значения не применяются в качестве порядковых номеров символов.

offset

Смещение начала поиска. Если не задан, используется 0. Если значение отрицательно, отсчёт идёт с конца строки.

encoding

Параметр encoding представляет собой символьную кодировку. Если он опущен или равен null, вместо него будет использовано значение внутренней кодировки.

Возвращаемые значения

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

Список изменений

Версия Описание
8.0.0 Теперь параметр
encoding
может принимать значение null.
7.1.0 Добавлена поддержка отрицательных значений offset.

Смотрите также

  • mb_internal_encoding() — Установка/получение внутренней кодировки скрипта
  • strpos() — Возвращает позицию первого вхождения подстроки

Строковая функция PHP: substr — Возвращает подстроку

 

string

Входная строка. Должна содержать хотя бы один символ.

start

Если start неотрицателен, возвращаемая подстрока начинается с позиции start от начала строки, считая от нуля. Например, в строке ‘abcdef’, в позиции 0 находится символ ‘a’, в позиции 2 — символ ‘c’, и т.д.

Если start отрицательный, возвращаемая подстрока начинается с позиции, отстоящей на startсимволов от конца строки string.

Если string меньше чем start символов, будет возвращено FALSE.

length

Если length положительный, возвращаемая строка будет не длиннее length символов, начиная с параметраstart (в зависимости от длины string).

Если length отрицательный, то будет отброшено указанное этим аргументом число символов с конца строки string (после того как будет вычислена стартовая позиция, если start отрицателен). Если при этом позиция начала подстроки, определяемая аргументом start, находится в отброшенной части строки или за ней, возвращается FALSE.

Если указан параметр length и является одним из 0, FALSE или NULL, то будет возвращена пустая строка.

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

Примеры использования substr в PHP:

 

Пример #1 Использование отрицательного параметра start

 

<?php$rest = substr("iamalone", -1);    // возвращает "e"$rest = substr("iamalone", -2);    // возвращает "ne"$rest = substr("iamalone", -3, 1); // возвращает "o"?>

 

Пример #2 Использование отрицательного параметра length

<?php$rest = substr(«iamalone», 0, -1); // возвращает «iamalon»$rest = substr(«iamalone», 2, -1); // возвращает «malon»$rest = substr(«iamalone», 4, -4); // возвращает false$rest = substr(«iamalone», -3, -1); // возвращает «on»?>

Пример #3 Базовое использование substr()
<?phpecho substr('abcdef', 1);     // bcdefecho substr('abcdef', 1, 3);  // bcdecho substr('abcdef', 0, 4);  // abcdecho substr('abcdef', 0, 8);  // abcdefecho substr('abcdef', -1, 1); // f
 // Получить доступ к отдельному символу в строке// можно также с помощью "квадратных скобок"$string = 'abcdef';echo $string[0];                 // aecho $string[3];                 // decho $string[strlen($string)-1]; // f
 ?>

Пример #4 substr() и приведение типов

<?phpclass apple {
    public function __toString() {
        return "green";
    }}
 echo "1) ". var_export(substr("pear", 0, 2), true).PHP_EOL;echo "2) ".var_export(substr(54321, 0, 2), true).PHP_EOL;echo "3) ".var_export(substr(new apple(), 0, 2), true).PHP_EOL;echo "4) ".var_export(substr(true, 0, 1), true).PHP_EOL;echo "5) ".var_export(substr(false, 0, 1), true).PHP_EOL;echo "6) ".var_export(substr("", 0, 1), true).PHP_EOL;echo "7) ".var_export(substr(1.2e3, 0, 4), true).PHP_EOL;?>

Интересная информация использования substrв PHP:

 

 — В PHP 7.0.0

 

Если длина строки string равна количеству символов, указанному в start, то возвращается пустая строка. До этой версии в этом случае возвращалась FALSE.

 

 — В PHP 5.2.2 — 5.2.6

 

Если параметр start указывает на позицию с отрицательной обрезкой, возвращается FALSE. Другие версии возвращают строку с начала.

 

 — Возвращает FALSE в случае ошибки.

 

<?phpvar_dump(substr('a', 2)); // bool(false)?>

- Для получения подстроки символов UTF-8, я настоятельно рекомендую mb_substr

<?php
        $utf8string = "cakeæøå";
 
        echo substr($utf8string,0,5);
        // output cake#
        echo mb_substr($utf8string,0,5,'UTF-8');
        //output cakeæ?>
 
- Может быть, следующими функциями будет легче извлечь нужные части из строки:
<?php
after ('@'>, 'Этот адрес электронной почты защищен от спам-ботов.  У вас должен быть включен JavaScript для просмотра.');//вернет 'online.ge'//от первого появления '@'>
 
before ('@'>, 'Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.');// вернет 'biohazard'// от первого появления '@'>
 
between ('@'>, '.', 'Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.');// вернет 'online'// от первого появления '@'>
 
after_last ('[', 'sin[90]*cos[180]');// вернет '180]'// от последнего появления '['
 
before_last ('[', 'sin[90]*cos[180]');// вернет 'sin[90]*cos['// от последнего появления '['
 
between_last ('[', ']', 'sin[90]*cos[180]');// вернет '180'// от последнего появления '['?>

Сами функции

<?php
 
    function after ($this, $inthat)
    {
        if (!is_bool(strpos($inthat, $this)))
        return substr($inthat, strpos($inthat,$this)+strlen($this));
    };
 
    function after_last ($this, $inthat)
    {
        if (!is_bool(strrevpos($inthat, $this)))
        return substr($inthat, strrevpos($inthat, $this)+strlen($this));
    };
 
    function before ($this, $inthat)
    {
        return substr($inthat, 0, strpos($inthat, $this));
    };
 
    function before_last ($this, $inthat)
    {
        return substr($inthat, 0, strrevpos($inthat, $this));
    };
 
    function between ($this, $that, $inthat)
    {
        return before ($that, after($this, $inthat));
    };
 
    function between_last ($this, $that, $inthat)
    {
     return after_last($this, before_last($that, $inthat));
    };
 // Используйте функцию strrevpos, если ваша версия php не включает егоfunction strrevpos($instr, $needle){
    $rev_pos = strpos (strrev($instr), strrev($needle));
    if ($rev_pos===false) return false;
    else return strlen($instr) - $rev_pos - strlen($needle);};?>

— Любой, кто приходит из мира Python, будет привыкать к созданию подстрок, используя «индекс фрагмента» в строке. Следующая функция эмулирует основное поведение последовательности строк Python. (Более сложная версия может быть создана для поддержки ввода массива, а также строки и необязательного третьего аргумента «step»).

<?php
 function py_slice($input, $slice) {
    $arg = explode(':', $slice);
    $start = intval($arg[0]);
    if ($start < 0) {
        $start += strlen($input);
    }
    if (count($arg) === 1) {
        return substr($input, $start, 1);
    }
    if (trim($arg[1]) === '') {
        return substr($input, $start);
    }
    $end = intval($arg[1]);
    if ($end < 0) {
        $end += strlen($input);
    }
    return substr($input, $start, $end - $start);}
 print py_slice('abcdefg', '2') . "\n";print py_slice('abcdefg', '2:4') . "\n";print py_slice('abcdefg', '2:') . "\n";print py_slice('abcdefg', ':4') . "\n";print py_slice('abcdefg', ':-3') . "\n";print py_slice('abcdefg', '-3:') .
"\n";  ?>
 

 


Параметр $ slice может быть одним символьным индексом или диапазоном, разделенным двоеточием. Начало диапазона включено, и конец является исключительным, что может противоречить интуиции. (Например, py_slice (‘abcdefg’, ‘2: 4’) дает ‘cd’, а не ‘cde’). Значение отрицательного диапазона означает отсчет от конца строки, а не от начала. И начало, и конец диапазона можно опустить; Начало по умолчанию равно 0, а по умолчанию используется общая длина ввода.

 

Результат:

 

c

 

cd

 

cdefg

 

abcd

 

abcd

 

efg

— Вы можете ожидать, что substr (‘123456’, 6) вернет пустую строку. Вместо этого возвращается логический FALSE. Если вам нужна пустая строка вместо логического FALSE, вы должны привести результат к строке.

 

<?php$a=substr(‘123456’,6);// $a = FALSE $a=(string)substr(‘123456’,6);// $a = »; ?>

— Здесь мы имеем функцию gr8, которая просто преобразует ip-адрес в число, используя substr с отрицательным смещением. Она может понадобиться, если вы хотите сравнить некоторые IP-адреса, преобразованные в числа. Например, при использовании ip2country или исключении такого же диапазона IP-адресов с вашего сайта.

 

<?php 
 function ip2no($val) {    
    list($A,$B,$C,$D)    =    explode(".",$val); 
    return 
        substr("000".$A,-3). 
        substr("000".$B,-3). 
        substr("000".$C,-3). 
        substr("000".$D,-3); } 
 $min        =    ip2no("10.11.1.0"); $max        =    ip2no("111.11.1.0"); $visitor    =    ip2no("105.1.20.200"); 
 if($min<$visitor && $visitor<$max)    
    {    echo 'Welcome !';    } else    
    {    echo 'Get out of here !';    } 
 ?>
 

 

php — strpos не работает для первой строки среди строк через запятую

Посмотрите эту демонстрационную версию

У меня есть два списка строк, разделенных запятыми, и я хочу найти строки и вернуть сообщение. Я заметил, что в конкретном случае, когда я ищу первую строку первого списка, он не найдет ее. Если я переместу эту строку в другое место, она будет. Не могу понять почему.

$dynamic_list = "AZ, CA, CO";
$static_list = "MN,WA,IA";

$search = "AZ";


if ( strpos($dynamic_list . ',' . $static_list, $search) == false && !empty($search) ) { // check string is not empty + that it is not on any of the lists
    echo 'not found: String '.$search.' was not found in lists';
} else {
    echo 'found';
}

0

user8411456 4 Июл 2019 в 11:59

3 ответа

Лучший ответ

Обратите внимание на наше использование ===. Просто == не будет работать должным образом, потому что позиция ‘A’ в ‘AZ’ является 0-м (первым) символом. Так что === сделает работу для вас здесь. Давайте попробуем с ===

Смотрите примеры здесь: https: //www.php .net / ручной / EN / function.strpos.php

Внимание

Эта функция может возвращать логическое значение FALSE, но также может возвращать и не булево значение, которое оценивается как FALSE. Пожалуйста, прочитайте раздел о логических значениях для получения дополнительной информации. Используйте оператор === для проверки возвращаемого значения этой функции.

<?php

$dynamic_list = "AZ, CA, CO";
$static_list = "MN,WA,IA";
$search = "AZ";

if (strpos($dynamic_list . ',' . $static_list, $search) === false) {
    echo 'not found: String '.$search.' was not found in lists';
} else {
    echo 'found';
}

ДЕМО: https://3v4l.org/bo4Yjr

1

Always Sunny 4 Июл 2019 в 09:08

Вам просто нужно заменить === на ==, поэтому он будет проверять тип переменной на, здесь ваш strpos() возвращает 0, который будет читаться так же, как и ваш, если получит

$dynamic_list = "AZ, CA, CO";
$static_list = "MN,WA,IA";
$search = "AZ";
if ( strpos($dynamic_list .  ',' . $static_list, $search) === false && !empty($search) ) { 
        echo 'not found: String '.$search.' was not found in lists';
} else {
        echo 'found';
}

1

M.Hemant 4 Июл 2019 в 09:07

    $dynamic_list = "AZ, CA, CO";
    $static_list = "MN,WA,IA";

    $search = "AZ";


    if ( strpos($dynamic_list . ',' . $static_list, $search) === false && !empty($search) ) { // check string is not empty + that it is not on any of the lists
        echo 'not found: String '.$search.' was not found in lists';
    } else {
        echo 'found';
    }

Добавьте === и попробуйте

2

nageen nayak 4 Июл 2019 в 09:02

php — Как проверить, содержит ли строка определенное слово?

Вы можете использовать регулярные выражения, так как это лучше для сопоставления слов по сравнению с strpos , как упоминали другие пользователи. strpos check for are также вернет true для таких строк, как: fare, care, stare и т. Д. Эти непреднамеренные совпадения можно просто избежать в регулярном выражении, используя границы слов.

Простое совпадение для и может выглядеть примерно так:

  $ a = 'Как дела?';

if (preg_match ('/ \ bare \ b /', $ a)) {
    echo 'true';
}
  

Что касается производительности, strpos примерно в три раза быстрее.Когда я сделал один миллион сравнений за один раз, для завершения preg_match потребовалось 1,5 секунды, а для strpos — 0,5 секунды.

Редактировать: Чтобы искать в любой части строки, а не просто дословно, я бы рекомендовал использовать регулярное выражение, например

.
  $ a = 'Как дела?';
$ search = 'are y';
if (preg_match ("/ {$ search} / i", $ a)) {
    echo 'true';
}
  

i в конце регулярного выражения изменяет регулярное выражение на регистронезависимое. Если вы этого не хотите, вы можете не указывать его.

Теперь это может быть довольно проблематично в некоторых случаях, так как строка $ search никоим образом не дезинфицируется, я имею в виду, что в некоторых случаях она может не пройти проверку, как если бы $ search — это ввод пользователя, они могут добавить некоторые строка, которая может вести себя как другое регулярное выражение …

Кроме того, вот отличный инструмент для тестирования и просмотра объяснений различных регулярных выражений Regex101

Чтобы объединить оба набора функций в единую многоцелевую функцию (в том числе с возможностью выбора чувствительности к регистру), вы можете использовать что-то вроде этого:

  функция FindString ($ Need, $ haystack, $ i, $ word)
{// $ i должно быть "" или "i" без учета регистра
    если (strtoupper ($ word) == "W")
    {// если $ word равно "W", то поиск слова вместо строкового поиска.если (preg_match ("/ \ b {$ игла} \ b / {$ i}", $ стог сена))
        {
            вернуть истину;
        }
    }
    еще
    {
        если (preg_match ("/ {$ Need} / {$ i}", $ haystack))
        {
            вернуть истину;
        }
    }
    вернуть ложь;
    // Поместите выше true и false в кавычки, чтобы вернуть их как строки, а не как bools / ints. 
}
  

Еще одна вещь, которую следует иметь в виду, это то, что \ b не будет работать на других языках, кроме английского.

Объяснение этого и решение взято отсюда:

\ b представляет начало или конец слова (границы слова).Этот регулярное выражение будет соответствовать яблоку в яблочном пироге, но не будет соответствовать яблоку в ананас, тележки с яблоками или запеканки.

Как насчет «кафе»? Как мы можем извлечь слово «кафе» в регулярном выражении? На самом деле \ bcafé \ b не сработает. Почему? Поскольку «кафе» содержит не-ASCII-символ: é. \ b нельзя просто использовать с Unicode, например समुद्र, 감사, месяц и 😉.

Если вы хотите извлечь символы Unicode, вы должны напрямую определить символы, которые представляют границы слова.

Ответ: (? <= [\ S ,.) '. $ слово. '(? = [\ s,.:; "\'] | $) / ', $ str)) return true; } вернуть ложь; }

Начиная с PHP 8. 0.0 теперь вы можете использовать str_contains

   

Поиск строк с помощью функций PHP strpos / stripos

Функция strpos в PHP

PHP strpos - это строковая функция, которая используется для поиска подстроки в заданной строке.Он возвращает числовое значение первого вхождения указанной строки поиска.

Синтаксис для использования strpos

Вот как вы можете использовать функцию strpos в PHP:

$ position = strpos ($ given_string, $ search_string);


Примечание. Функция strpos выполняет поиск в строке с учетом регистра. Таким образом, поисковые запросы «Test» и «test» будут иметь разные значения.

Кроме того, позиция начинается с 0, а не с 1.

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

Простой пример использования функции strpos

См. Следующий пример, в котором я использовал жестко запрограммированные строки для демонстрации строковой функции strpos PHP.

См. Онлайн-демонстрацию и код

Код PHP:

1

2

3

4

5

6

7

8

9

10

11

12

13

140002

14

18

19

20

21

$ source_string = 'Это strpos Tuotrial, который используется для поиска строк.Он сообщает, содержит ли данная строка строку поиска или нет! ';

$ search_term = 'strpos';

$ posistion = strpos ($ source_string, $ search_term);

if ($ posistion === false) {

echo "Исходная строка не содержит: '$ search_term'!";

} else {

echo "Строка содержит поисковый запрос: '$ search_term'!
";

echo "Данная подстрока найдена по адресу: $ posistion";

}

?>


Результатом вышеуказанного кода будет:

Строка содержит поисковый запрос: ‘strpos’!

Данная подстрока находится по адресу: 10

Пример PHP strpos с введенным пользователем поисковым запросом

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

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

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

Посмотреть демонстрацию онлайн:

См. Онлайн-демонстрацию и код

Для демонстрации я использовал следующую исходную строку:

$ source_string = 'В этой демонстрации я использую введенный пользователем поисковый запрос, чтобы проверить, содержит ли строка поисковый запрос или нет, с помощью strpos!';


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

Использовался следующий код PHP:

1

2

3

4

5

6

7

8

9

10

11

12

13

140002

14

18

19

20

21

22

23

24

25

26

27

28

29

31

$ search_term = $ _ POST ["searchterm"];

$ source_string = 'В этой демонстрации я использую введенный пользователем поисковый запрос, чтобы проверить, содержит ли строка поисковый запрос или нет, с помощью strpos!';

// = 'strpos';

$ posistion = strpos ($ source_string, $ search_term);

if ($ search_term) {

echo "

";

if ($ posistion === false) {

echo "Исходная строка не содержит: '$ search_term'!";

} else {

echo "Строка содержит поисковый запрос: '$ search_term'!
";

echo "Данная подстрока найдена по адресу: $ posistion";

}

эхо "

";

}

?>


Если вас интересует разметка для презентации:

1

2

3

4

5

6

7

8

9

10

11

12

13

140002 14

18

19

20

21

22

23

24

25

26

27

28

29

30

000

000

34

35

36

37

38

39

40

41

42

43

44

45

46

47

51

52

53

54

55

56

57

58

59

60

61

62

63


Вы можете увидеть полный код в области исходного кода демонстрационной страницы.

Точно так же вы можете использовать строку, управляемую базой данных, в качестве источника для создания функции поиска на вашем веб-сайте. Я также написал руководство по использованию строковой функции strpos PHP с методом jQuery ajax. (см. ссылку внизу)

Поиск без учета регистра с использованием функции stripos

Как упоминалось ранее, strpos является чувствительной к регистру функцией для поиска строк в PHP. Для поиска в строке без учета регистра используйте функцию stripos PHP .

Синтаксис почти такой же, как у strpos, e.г .:

$ position = stripos ($ given_string, $ search_string);


Позвольте мне показать вам, как работает метод PHP stripos, на почти тех же примерах, которые я использовал в примерах выше. На этот раз заменив strpos функцией stripos.

Пример полосы с жестко заданными значениями

В этой демонстрации создается исходная строка со следующей строкой:

$ source_string = 'Это учебное пособие по полосам, которое используется для поиска строк. Он сообщает, содержит ли данная строка строку поиска или нет! ';


Пока используется поисковый запрос: $ search_term = ‘tutorial’;

Хотя в исходной строке используется заглавная буква, см. Вывод в Интернете:

См. Онлайн-демонстрацию и код

Пример с введенным пользователем поисковым запросом

Этот пример такой же, как и для метода strpos, однако в нем используется метод stripos.Попробуйте существующие буквы / слова с разными регистрами и посмотрите результат.

См. Онлайн-демонстрацию и код

Изменена только эта строка кода, чем в приведенном выше примере strpos:

$ posistion = stripos ($ source_string, $ search_term);


См. Также: строка поиска в PHP с помощью ajax

Php strpos не работает должным образом

Это сводит мои глаза с ума прямо сейчас. Должно работать, но это не так. Я сохраняю значения (названия округов), выбранные пользователем из множественного выбора, в строке, разделенной запятыми. Затем, когда форма отправлена ​​и отклонена, я использую эту строку, чтобы «выбрать» те, которые были ранее выбраны.

Что я пробовал:

Вот мой тестовый код:

 
Список всех округов:'; foreach ($ countties как $ one_county): эхо '
'.$ one_county ['Графство']; if (strpos ($ saved_counties, $ one_county ['Графство'])) { echo '(**** В ПРЕДЫДУЩЕМ ВЫБОРЕ ***)'; } endforeach; ?>

Когда я запускаю код, я получаю следующее:

Предыдущий выбор: Baraga, Barry, Bay

Список всех округов:
Alcona
Алжир
Аллеган
Алпена
Антрим
Arenac
Барага
Барри (**** В ПРЕДЫДУЩЕМ ВЫБОРЕ ***)
Бухта (**** В ПРЕДЫДУЩЕМ ВЫБОРЕ ***)
Benzie
Berrien
Филиал
Калхун
Касс
Шарлевуа
Чебойган
Chippewa
Клэр
Клинтон
Кроуфорд
Дельта
Дикинсон
Eaton
Эммет

Почему пропускает "Барагу"? Неважно, какую группу я выберу. Он всегда пропускает первый в коде foreach. Я пробовал:

strpos ($ saved_counties, $ one_county ['County'])> = 0 

Это дало те же результаты.

Еще пробовал:

strpos ($ saved_counties, $ one_county ['County'])> 0 

Это закончилось повторным выбором ВСЕХ из них.

$ округа - это массив, в котором хранятся ВСЕ 83 округа Мичигана. $ saved_counties - это просто разделенная запятыми строка, в которой хранится предыдущий выбор пользователя.

Почему PHP strpos дает неправильный ответ?

Опубликовано в статьях

Может показаться, что функция strpos в PHP дает неправильный ответ, если не используется должным образом.

strpos предназначен для возврата целочисленной позиции первого вхождения «подстроки» в «строку», где подстрока - это «игла», переданная в качестве второго аргумента, а «строка» - это «стог сена», переданная в качестве первого. аргумент…

 int strpos (строка $ haystack, смешанная $ Need [, int $ offset = 0]) 

Третий аргумент является необязательным (поэтому в этом примере мы не будем об этом беспокоиться).

Однако часто strpos используется, чтобы определить, содержится ли строка в другой строке. Например, чтобы узнать, содержится ли слово «кошка» в слове «категория», правильный способ сделать это…

В качестве альтернативы можно написать…

, что тоже правильно.

strpos («category», «cat») вернет логическое значение false тогда и только тогда, когда не сможет найти второй аргумент в первом. Обратите внимание, что мы используем тройной знак равенства === для оператора «идентичного», а не только двойной знак равенства == оператора «равно».То же и с отрицательной версией. Используйте ! == , а не ! = .

Проблема возникает при использовании неправильного оператора. Если использовался оператор «равно», как в…

может показаться, что strpos дает неправильный ответ. Потому что он отображает «кошки не в категории», хотя это явно так.

Это потому, что…

strpos («категория», «кот»)

возвращает 0 (числовой ноль). «Кошка» находится в позиции нулевого индекса «категории».Цифра 0 равна false при использовании оператора равенства двойного равенства. Цифра 0 не идентична false по сравнению с тройным знаком равенства.

В руководстве PHP по strpos говорится…

«Эта функция может возвращать логическое значение ЛОЖЬ, но также может возвращать не логическое значение, которое оценивается как ЛОЖЬ. … Используйте оператор === для проверки возвращаемого значения этой функции ».

Здесь мы должны использовать тройное равенство. То же самое и с другими strpos-подобными функциями, такими как stripos, strrpos и strripos.


Вариант PHP strpos, принимающий массив игл: strposm


Вариант PHP strpos, принимающий массив игл: strposm

Стандартная функция библиотеки PHP strpos принимает только строку для своего параметра $ Need . Часто было бы полезно, чтобы он также принимал массив строк. Вот функция замены strposm (которую также можно было бы назвать strpos_array ), которая принимает массивы, но также принимает строку для совместимости со стандартным strpos .Он использует preg_match.

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

Я включил несколько версий. Первый является полнофункциональным и может также выполнять поиск без учета регистра. По соображениям производительности он оборачивается вокруг strpos и stripos , когда $ иглы не является массивом. Вторая - это та же полнофункциональная версия с обширными комментариями. Третья - минимальная версия для тех, кто хочет избежать раздувания - она ​​не поддерживает поиск без учета регистра и не оборачивает strpos / stripos , когда $ иглы - скалярная строка.Четвертая - еще более минимальная версия, размер которой уменьшен, поскольку она возвращает массив, а не передает одно из возвращаемых значений в качестве параметра по ссылке.

Функция: strposm

Описание : Находит позицию первого вхождения в строке $ haystack любой из предоставленных подстрок в $ иглы , начиная со смещения $ смещения и далее. $ иглы не обязательно должен быть массивом строк, но также может быть отдельной (скалярной) строкой.Соответствует без учета регистра, если $ flags включает STRPOSM_CI . Возвращает совпадающую иглу в $ match , если указан этот параметр. По умолчанию это $ haystack , но если $ flags включает STRPOSM_NC , то это $ иглы . В качестве альтернативы, если $ flags включает STRPOSM_MATCH_AS_INDEX , тогда $ соответствует устанавливается на индекс $ игл соответствующей иглы.
Возвращает : Положение первого появления любого из $ игл в $ haystack , или false , если ни одно из них не встречается. Если задано, $ match возвращает либо соответствующую иглу, либо ее индекс, как описано выше. Если ничего не совпадает, то $ match устанавливается на false или null , соответственно, в зависимости от того, установлен ли флаг STRPOSM_MATCH_AS_INDEX или нет.
Автор : Я (Лэрд Шоу).
Лицензия : Общественное достояние.
Атрибуция : Необязательно. Если вы решите указать авторство при использовании этой функции, не стесняйтесь ссылаться на эту страницу.
 / *
 * Вариант strpos, который принимает массив из $ Needles - или просто строку,
 * так что его можно использовать как замену стандартным strpos,
 * и в этом случае он просто оборачивается вокруг strpos и stripos, чтобы не
 * для снижения производительности.*
 * «M» в «strposm» означает, что он принимает * m * несколько игл.
 *
 * Находит самое раннее совпадение * любой * иглы. Возвращает позицию
 * это совпадение или false, если ничего не найдено, как и стандартный strpos. По выбору
 * также возвращает через $ match либо соответствующую иглу в виде строки (по умолчанию)
 * или указатель на $ иглы соответствующей иглы (если
 * Установлен флаг STRPOSM_MATCH_AS_INDEX).
 *
 * Поиск без учета регистра можно указать с помощью флага STRPOSM_CI.
 * Обратите внимание, что для поиска без учета регистра, когда флаг STRPOSM_MATCH_AS_INDEX
 * не установлен, поэтому $ match должно содержать соответствующую иглу, а не ее
 * index, то по умолчанию $ match будет в случае стога сена, но по умолчанию
 * можно переопределить, установив также флаг STRPOSM_NC (см.  пример ниже) в
 * в каком случае $ match будет в случае иглы.*
 * Флаги можно комбинировать с помощью побитового оператора или,
 * например, $ flags = STRPOSM_CI | STRPOSM_NC
 * /
определить ('STRPOSM_CI', 1); // CI => "без учета регистра".
определить ('STRPOSM_NC', 2); // NC => "игольница".
определить ('STRPOSM_MATCH_AS_INDEX', 4);
function strposm ($ haystack, $ Needles, $ offset = 0, & $ match = null, $ flags = 0) {
if (! is_array ($ Needles)) {
$ func = $ flags & STRPOSM_CI? 'stripos': 'strpos';
$ pos = $ func ($ haystack, $ Needles, $ offset);
if ($ pos! == false) {
$ match = (($ flags & STRPOSM_MATCH_AS_INDEX)
? 0
: (($ flags & STRPOSM_NC)
? $ иглы
: substr ($ haystack, $ pos, strlen ($ Needles))
)
);
return $ pos;
} else goto strposm_no_match;
}

$ Needles_esc = array_map ('preg_quote', $ иглы);
if (($ flags & STRPOSM_NC) || ($ flags & STRPOSM_MATCH_AS_INDEX)) {
$ Needles_esc = array_map (
функция ($ игла) {возврат '('.$ Need. ')';},
$ Needles_esc
);
}
$ pattern = '(' .implode ('|', $ Needles_esc).  ')';
если ($ flags & STRPOSM_CI) $ шаблон. = 'я';
if (preg_match ($ pattern, $ haystack, $ match, PREG_OFFSET_CAPTURE, $ offset)) {
$ found = array_shift ($ соответствует);
if (($ flags & STRPOSM_NC) || ($ flags & STRPOSM_MATCH_AS_INDEX)) {
$ index = array_search ($ найдено, $ соответствует);
}
$ match = (($ flags & STRPOSM_MATCH_AS_INDEX)
? $ index
: (($ flags & STRPOSM_NC)
? $ иглы [$ index]
: $ найдено [0]
)
);
return $ found [1];
}

strposm_no_match:
$ match = ($ flags & STRPOSM_MATCH_AS_INDEX)? ложь: ноль;
вернуть ложь;
}
 
Пример использования:
 $ haystack = 'У продавца фруктов мы купили бананы, вишню и манго: хорошие фрукты.';
$ Needles = array ('яблоки', 'манго', 'вишни', 'бананы', 'апельсины');
$ Needles_uc = array ('ЯБЛОКИ', 'МАНГО', 'ВИШНЯ', 'БАНАНЫ', 'АПЕЛЬСИНЫ');

// Используется как замена strpos.
$ pos = strposm ($ haystack, / * $ игла * / 'фрукт');
echo "\ $ pos == $ pos \ n"; // Вывод: $ pos = 7

// Используется как замена strpos со смещением.
$ pos = strposm ($ haystack, / * $ Need * / 'fruit', / * $ offset * / 8);
echo "\ $ pos == $ pos \ n"; // Вывод: $ pos = 66

// Базовое использование с несколькими иглами. 
$ pos = strposm ($ haystack, $ иголки);
echo "\ $ pos == $ pos \ n"; // Вывод (соответствие "бананов"): $ pos = 30

// Используется с несколькими иглами и смещением.$ pos = strposm ($ haystack, $ Needles, / * $ offset * / 31);
echo "\ $ pos == $ pos \ n"; // Вывод (соответствие "вишенки"): $ pos = 39

// Используем с несколькими иглами, возвращая подходящую иглу.
// Выходы:
// Самое раннее появление любой из игл было в позиции 30 для иглы «бананы».
$ pos = strposm ($ haystack, $ Needles, / * $ offset * / 0, $ match);
echo "Самое раннее появление любой из игл было в позиции $ pos для иглы '$ match'. \ n";

// Используется с несколькими иглами, возвращая индекс соответствующей иглы.// Выходы:
// Самое раннее появление любой из игл было в позиции 30, соответствующей игле с индексом 4, 'бананы'.
$ pos = strposm ($ haystack, $ Needles, / * $ смещение * / 0, $ match, / * $ flags * / STRPOSM_MATCH_AS_INDEX);
echo "Первая игла возникла в позиции $ pos,".
     "соответствует игле с индексом $ match, '{$ Needles [$ match]}'.  \ n";

// Использование с несколькими иглами, совпадение без учета регистра и смещение,
// возвращаем соответствующую иглу в случае стога сена.// Выводит (обратите внимание на иглу в нижнем регистре в $ match, хотя $ Needles_uc содержит иглы в верхнем регистре;
// это из-за отсутствия флага STRPOSM_NC):
// Самое раннее появление любой из игл было в позиции 39 для иглы 'вишни'.
$ pos = strposm ($ haystack, $ Needles_uc, / * $ смещение * / 31, $ match, / * $ flags * / STRPOSM_CI);
echo "Самое раннее появление любой из игл было в позиции $ pos для иглы '$ match'. \ n";

// Использование с несколькими иглами, совпадение без учета регистра и смещение,
// возвращаем соответствующую иглу в игольном футляре.// Выводит (обратите внимание на заглавную стрелку в $ match из-за флага STRPOSM_NC):
// Самое раннее появление любой из игл было в позиции 39 для иглы «ВИШНЯ».
$ pos = strposm ($ haystack, $ Needles_uc, / * $ смещение * / 31, $ match, / * $ flags * / STRPOSM_CI | STRPOSM_NC);
echo "Самое раннее появление любой из игл было в позиции $ pos для иглы '$ match'.  \ n";
 

С комментариями:
 function strposm ($ haystack, $ Needles, $ offset = 0, & $ match = null, $ flags = 0) {
// В особом случае, когда $ Needles не является массивом, просто переносим
// strpos и stripos по соображениям производительности.if (! is_array ($ Needles)) {
$ func = $ flags & STRPOSM_CI? 'stripos': 'strpos';
$ pos = $ func ($ haystack, $ Needles, $ offset);
if ($ pos! == false) {
$ match = (($ flags & STRPOSM_MATCH_AS_INDEX)
? 0
: (($ flags & STRPOSM_NC)
? $ иглы
: substr ($ haystack, $ pos, strlen ($ Needles))
)
);
return $ pos;
} else goto strposm_no_match;
}

// $ Needles - это массив. Сначала действуйте соответствующим образом...
// ... экранирование метасимволов регулярного выражения в иголках.
$ Needles_esc = array_map ('preg_quote', $ иглы);
// Если установлен один из флагов «иглы» или «совпадение по индексу»,
// затем создаем под совпадение для каждой ускользнувшей иглы, заключая его в
// круглые скобки. Мы используем их позже, чтобы найти индекс соответствия
// иголка. 
if (($ flags & STRPOSM_NC) || ($ flags & STRPOSM_MATCH_AS_INDEX)) {
$ Needles_esc = array_map (
функция ($ игла) {возврат '('. $ игла. ')';},
$ Needles_esc
);
}
// Создаем шаблон регулярного выражения для поиска всех игл.$ pattern = '(' .implode ('|', $ Needles_esc). ')';
// Если установлен флаг "без учета регистра", то модифицируем обычный
// выражение с «i», что означает, что совпадение «без регистра».
если ($ flags & STRPOSM_CI) $ шаблон. = 'я';
// Находим первое совпадение, включая его смещение.
if (preg_match ($ pattern, $ haystack, $ match, PREG_OFFSET_CAPTURE, $ offset)) {
// Извлекаем первую запись, полное совпадение, из массива совпадений.
$ found = array_shift ($ соответствует);
// Если нам нужен индекс совпадающей иглы, то...
if (($ flags & STRPOSM_NC) || ($ flags & STRPOSM_MATCH_AS_INDEX)) {
// ... находим индекс совпадающего совпадения, который идентичен
// к общему совпадению, которое мы только что вытащили.
// Поскольку вспомогательные совпадения находятся в том же порядке, что и иглы,
// это также индекс в $ иголки соответствия
// иголка. 
$ index = array_search ($ найдено, $ соответствует);
}
// Если установлен флаг "совпадение по индексу", то возврат в $ match
// индекс соответствующей иглы, иначе ...
$ match = (($ flags & STRPOSM_MATCH_AS_INDEX)
? $ index
//...если установлен флаг "игла", то индексируйте в
// $ иглы с использованием ранее определенного индекса для возврата
// в $ соответствует совпадающей игле в случае иглы, иначе ...
: (($ flags & STRPOSM_NC)
? $ иглы [$ index]
// ... по умолчанию возврат в $ соответствует совпадающей игле в
// случай стога сена.
: $ найдено [0]
)
);
// Возвращаем захваченное смещение.
return $ found [1];
}

strposm_no_match:
// Ничего не найдено. Установите соответствующие возвращаемые значения.
$ match = ($ flags & STRPOSM_MATCH_AS_INDEX)? ложь: ноль;
вернуть ложь;
}
 

Первая минимальная версия:
 function strposm_min1 ($ haystack, $ Needles, $ offset = 0, & $ match = null) {
$ pattern = '('.implode ('|', array_map ('preg_quote', (массив) $ иглы)). ')';
if (preg_match ($ pattern, $ haystack, $ match, PREG_OFFSET_CAPTURE, $ offset)) {
$ match = $ match [0] [0];
вернуть $ match [0] [1];
} еще {
$ match = null;
вернуть ложь;
}
}
 
Пример использования:
 $ haystack = 'В магазине фруктов мы купили бананы, вишню и манго. ';
$ Needles = array ('яблоки', 'манго', 'вишни', 'бананы', 'апельсины');

// Выходы:
// Самое раннее появление любой из игл было в позиции 52 для иглы «манго».$ pos = strposm_min1 ($ haystack, $ Needles, / * $ offset * / 40, $ match);
echo "Самое раннее появление любой из игл было в позиции $ pos для иглы '$ match'. \ n";
 

Самая минимальная версия, возвращающая массив вместо передачи возвращаемого параметра по ссылке:
 function strposm_min2 ($ haystack, $ Needles, $ offset = 0) {
$ pattern = '(' .implode ('|', array_map ('preg_quote', (массив) $ иглы)). ')';
return preg_match ($ pattern, $ haystack, $ match, PREG_OFFSET_CAPTURE, $ смещение)
? array_reverse ($ соответствует [0])
: массив (ложь, ноль);
}
 
Пример использования:
 $ haystack = 'В магазине фруктов мы купили бананы, вишню и манго.';
$ Needles = array ('яблоки', 'манго', 'вишни', 'бананы', 'апельсины');

// Использовать без смещения.
// Выходы:
// Самое раннее появление любой из игл было в позиции 30 для иглы «бананы». 
список ($ pos, $ match) = strposm_min2 ($ haystack, $ Needles);
echo "Самое раннее появление любой из игл было в позиции $ pos для иглы '$ match'. \ n";

// Используйте со смещением.
// Выходы:
// Самое раннее появление любой из игл было в позиции 52 для иглы «манго».
list ($ pos, $ match) = strposm_min2 ($ haystack, $ Needles, / * $ offset * / 40);
echo "Самое раннее появление любой из игл было в позиции $ pos для иглы '$ match'.\ п ";

// Чтобы получить только позицию:
список ($ pos) = strposm_min2 ($ haystack, $ Needles, / * $ offset * / 40); // $ pos == 52

// Чтобы получить только соответствующую иглу:
list (, $ match) = strposm_min2 ($ haystack, $ Needles, / * $ offset * / 40); // $ match == 'манго'
 

PHP strpos ()

PHP strlen ()
Рейтинг:
PHP strrchr ()
Рейтинг:
PHP str_repeat ()
Рейтинг:
PHP strrev ()
Рейтинг:
PHP strrpos ()
Рейтинг:
PHP strstr ()
Рейтинг:
PHP strtolower ()
Рейтинг:
PHP strtoupper ()
Рейтинг:
PHP str_replace ()
Рейтинг:
PHP strtr ()
Рейтинг:
PHP substr ()
Рейтинг:
PHP substr_replace ()
Рейтинг:
PHP trim ()
Рейтинг:
PHP ucfirst ()
Рейтинг:
PHP ucwords ()
Рейтинг:
PHP stristr ()
Рейтинг:
PHP strip_tags ()
Рейтинг:
PHP strchr ()
Рейтинг:
PHP sprintf ()
Рейтинг:
PHP similar_text ()
Рейтинг:
PHP setlocale ()
Рейтинг:
PHP parse_str ()
Рейтинг:
PHP ord ()
Рейтинг:
PHP ltrim ()
Рейтинг:
PHP rtrim ()
Рейтинг:
PHP join ()
Рейтинг:
PHP implode ()
Рейтинг:
PHP htmlspecialchars ()
Рейтинг:
PHP flush ()
Рейтинг:
PHP eregi_replace ()
Рейтинг:
PHP ereg_replace ()
Рейтинг:
PHP explode ()
Рейтинг:
PHP echo ()
Рейтинг:
PHP print ()
Рейтинг:
PHP printf ()
Рейтинг:
PHP chr ()
Рейтинг:
PHP chop ()
Рейтинг:
PHP md5 ()
Рейтинг:
PHP base64_encode ()
Рейтинг:
PHP base64_decode ()
Рейтинг:
PHP nl2br ()
Рейтинг:
PHP urlencode ()
Рейтинг:
PHP добавляет косые черты ()
Рейтинг:
PHP eval ()
Рейтинг:
.