- Описание int strpos ( string haystack, string needle [, int offset] )
- Использование strpos() для регистрозависимого поиска
- Использование функции stripos() для регистронезависимого поиска
- Использование регулярных выражений
- Использование регулярных выражений для поиска точного вхождения слова
- Использование strstr() для поиска подстроки
- Описание
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- User Contributed Notes 8 notes
(PHP 3, PHP 4, PHP 5)
strpos — Возвращает позицию первого вхождения подстроки
Описание int strpos ( string haystack, string needle [, int offset] )
Возвращает позицию первого вхождения подстроки needle в строку haystack . В отличие от strrpos() , использует всю строку needle , а не только первый символ.
Если подстрока needle не найдена, strpos() возвращает FALSE .
Внимание |
Эта функция может возвращать как логическое значение FALSE , так и не относящееся к логическому типу значение, которое приводится к FALSE , например, 0 или "". За более подробной информации обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией.
Пример 1. Пример использования strpos()
= ‘abc’ ; $findme = ‘a’ ; $pos = strpos ( $mystring , $findme ); |
// Заметьте, что используется ===. Использование == не даст верного
// результата, так как ‘a’ в нулевой позиции.
if ( $pos === false ) <
echo "Строка ‘$findme’ не найдена в строке ‘$mystring1’" ;
> else <
echo "Строка ‘$findme’ найдена в строке ‘$mystring1’" ;
echo " в позиции $pos" ;
>
// Ищем , начиная со второго символа
$newstring = ‘abcdef abcdef’ ;
$pos = strpos ( $newstring , ‘a’ , 1 ); // $pos = 7, not 0
?>
Если needle не является строкой, он приводится к целому и трактуется как код символа.
Необязательный аргумент offset позволяет указать, с какого посчету символа строки haystack начинать поиск. Возвращается всегда позиция относительно начала строки haystack .
В этой статье рассматриваются различные методы поиска слова, символа или подстроки в тексте. Описываются преимущества и недостатки каждого метода.
Использование strpos() для регистрозависимого поиска
Простейшим способом проверить, содержит ли строка определённое слово, является использование PHP функции strpos(). Она возвращает позицию первого вхождения подстроки в строке или FALSE, если соответствия не найдены. Поэтому можно сравнить значение, возвращаемое функцией strpos() с FALSE, чтобы проверить наличие подстроки. Пример:
Обратите внимание, что я использовал оператор строгого неравенства (!==). Если искомое слово встречается в начале строки, функция strpos() вернёт 0. Это будет расценено оператором != как значение FALSE. Пример:
При поиске целого слова (например, “на”) функция также вернёт значение TRUE, если строка содержит такие слова, как “она”, “вена” или “например”.
Также можно использовать > -1 вместо !==. Потому что даже если strpos() вернёт 0 как значение индекса, он всё равно будет больше -1. Но помните, что оператор «больше» (>) работает медленнее оператора строгого неравенства (!==).
Использование функции stripos() для регистронезависимого поиска
Для регистрозависимого поиска можно использовать функцию stripos(). Она работает аналогично функции strpos(). Единственное отличие заключается в том, что она игнорирует регистр при поиске подстроки внутри другой строки.
Функция strpos() вернула бы значение FALSE во всех перечисленных выше случаях. Но функция stripos() проигнорировала регистр и вернула значение TRUE.
Другим способом поиска, независящим от регистра, является преобразование всех строк и подстрок в одинаковый регистр, используя функции strtolower() и strtoupper(). Для проверки можно использовать strpos(). Но проще stripos().
Использование регулярных выражений
Также для поиска можно использовать регулярные выражения. Они лучше подходят для случаев, когда вы ищете в строке более сложные конструкции.
Но помните, что функция strpos() работает в три раза быстрее, чем регулярные выражения. Следующий пример демонстрирует, как с их помощью найти слово, символ в строке:
Использование функции preg_match() имеет смысл только при сложном поиске. Например, для проверки того, содержит ли строка слова с десятью и более символами и т.п. Пример:
Чтобы сделать поиск регистронезависимым, добавьте флаг i в конец шаблона. Пример реализации:
Использование регулярных выражений для поиска точного вхождения слова
Функции strpos() и stripos()работают быстрее, чем регулярные выражения. Но их использование для поиска точного вхождения слова может быть проблематичным.
В подобных ситуациях лучше применять регулярные выражения. Можно использовать выражение b в шаблоне регулярного выражения, чтобы обозначить границу слова. Если слово, которое вы ищете, заключено в выражения b, функция preg_match() найдёт только точные вхождения слова и вернет FALSE для частичных совпадений. Вот пример:
Использование strstr() для поиска подстроки
PHP функция strstr() может быть использована для проверки вхождения символа или подстроки. Она возвращает часть исходной строки, начиная с первого вхождения искомого слова и до конца. Функция вернёт значение FALSE, если подстрока не найдена. Благодаря этому можно проверить, содержит ли строка подстроку. Вот пример:
Для регистронезависимого поиска используйте функцию stristr().
- Лучший метод поиска символа или слова в строке – PHP функции strpos(). Если нужно провести регистронезависимый поиск, применяйтеstripos(). Обе функции просты в использовании и работают быстрее остальных методов.
- Для сложного поиска используйте регулярные выражения. Вы также можете применять их для простого поиска, но они работают медленнее, чем функция strpos().
- Регулярные выражения полезны, когда вы ищете точное вхождение слова. Например, при поиске слова “сто” функция strpos() также вернёт значение TRUE, если строка содержит слово “Место”. С другой стороны, можно использовать выражение b в функции preg_match(), которая в таком случае возвратит FALSE.
- Используйте strstr() для регистрозависимого поиска и stristr() для регистронезависимого.
Данная публикация представляет собой перевод статьи « Best way to check if a string contains a specific word or substring in PHP » , подготовленной дружной командой проекта Интернет-технологии.ру
stripos — Возвращает позицию первого вхождения подстроки без учета регистра
Описание
Ищет позицию первого вхождения подстроки needle в строке haystack .
В отличие от strpos() , эта функция не учитывает регистр символов.
Список параметров
Строка, в которой производится поиск.
Заметьте, что needle может содержать строку из одного или более символов.
Если параметр needle не является строкой, он преобразуется в целое число и трактуется как код символа. Это поведение устарело с PHP 7.3.0, и полагаться на него крайне не рекомендуется. В зависимости от предполагаемого поведения, параметр needle должен быть либо явно приведен к строке, либо должен быть выполнен явный вызов chr() .
Если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. Если задано отрицательное значение, отсчет позиции начала поиска будет произведен с конца строки.
Возвращаемые значения
Возвращает позицию, в которой находится искомая строка, относительно начала строки haystack (независимо от смещения (offset)). Также обратите внимание на то, что позиция строки отсчитывается от 0, а не от 1.
Возвращает FALSE , если искомая строка не найдена.
Эта функция может возвращать как логическое значение FALSE , так и значение не типа boolean, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.
Список изменений
Версия | Описание |
---|---|
7.1.0 | Добавлена поддержка отрицательных значений offset . |
Примеры
Пример #1 Пример использования stripos()
= ‘a’ ;
$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 " ;
>
?>
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Смотрите также
- mb_stripos() — Регистронезависимый поиск позиции первого вхождения одной строки в другую
- strpos() — Возвращает позицию первого вхождения подстроки
- strrpos() — Возвращает позицию последнего вхождения подстроки в строке
- strripos() — Возвращает позицию последнего вхождения подстроки без учета регистра
- stristr() — Регистронезависимый вариант функции strstr
- substr() — Возвращает подстроку
- str_ireplace() — Регистронезависимый вариант функции str_replace
User Contributed Notes 8 notes
I found myself needing to find the first position of multiple needles in one haystack. So I wrote this little function:
function multineedle_stripos ( $haystack , $needles , $offset = 0 ) <
foreach( $needles as $needle ) <
$found [ $needle ] = stripos ( $haystack , $needle , $offset );
>
return $found ;
>
// It works as such:
$haystack = "The quick brown fox jumps over the lazy dog." ;
$needle = array( "fox" , "dog" , "." , "duck" )
var_dump ( multineedle_stripos ( $haystack , $needle ));
/* Output:
array(3) <
["fox"]=>
int(16)
["dog"]=>
int(40)
["."]=>
int(43)
["duck"]=>
bool(false)
>
*/
?>
Regarding the function by spam at wikicms dot org
It is very bad practice to use the same function name as an existing php function but have a different output format. Someone maintaining the code in the future is likely to be very confused by this. It will also be hard to eradicate from a codebase because the naming is identical so each use of stripos() would have to be analyzed to see how it is expecting the output format (bool or number/bool).
Calling it string_found() or something like that would make a lot more sense for long-term use.
Finding numbers in strings requires you to cast the number to string first.
strpos("123", 2) !== strpos("123", "2")
A handy function if you need to adjust layout based on whether or not a string contains descending letters:
function containsDescenders ( $text ) <
$descenders = array( "g" , "j" , "p" , "q" , "y" );
foreach ( $descenders as $letter ) <
if ( stripos ( $text , $letter ) !== false ) <
return true ;
>
>
return false ;
> ?>
this would to work with any language, i hope.
tested on czech (eastern europe) lang.
/****************************************
* SAFE HIGHLIGHT
****************************************/
/**
* function finds and encase every string in a $needleArr array with
* strings $shearLft (from the left side) and $shearRgt (guess from which
* side).
* already encased needles are IGNORED for any other step, so order
* of needles in $needleArr is pretty important.
*
* function is searching needles in case-insensitive mode,
* but case in the subject is saved.
*
* can you do it better? so, do it.
*
* @param array $needleArr array of needles
* @param string $shearLft left shear
* @param string $shearRgt right shear
* @param string $subject subject
* @param string $encoding encoding (‘utf-8’ is default)
*
* @author griffin
*/
function safeHighlight ( $needleArr , $shearLft , $shearRgt , $subject , $encoding = ‘utf-8’ )
<
// encoding
$e = $encoding ;
// oh, no needles
if( ! is_array ( $needleArr ))
return $subject ;
// empty keys throw-off, only unique, reindex
$nA = array_values (
array_unique (
array_diff ( $needleArr , array( » ))
)
);
// needle count
if( !( $nC = count ( $nA )))
return $subject ; // nothing to hl
// shear length
if( !(( $rLL = mb_strlen ( $rL = $shearLft , $e ))
+ ( $rRL = mb_strlen ( $rR = $shearRgt , $e ))))
return $subject ; // no shears
// subject length
if( !( $sL = mb_strlen ( $s = $subject , $e )))
return null ; // empty subject
// subject in lowercase (we need to aviod
// using mb_stripos due to PHP version)
$sW = mb_strtolower ( $s , $e );
0=not changed, 1=changed
$m = str_repeat ( ‘0’ , $sL );
// loop for each needle
for( $n = 0 ; $n $nC ; $n ++)
<
// needle string loWercase
$nW = mb_strtolower ( $nA [ $n ], $e );
$o = 0 ; // offset
$nL = mb_strlen ( $nW , $e ); // needle length
// search needle
while( false !== ( $p = mb_strpos ( $sW , $nW , $o , $e )))
<
// oh hurrey, needle found on $p position
// is founded needle already modified? (in full-length)
for( $q = $p ; $q $p + $nL ); $q ++)
if( $m [ $q ])
<
// ai, caramba. already modified, jump over
$o += $nL ;
// continue for while() loop — not for for() loop!
continue 2 ;
>
// explode subject and mask into three parts
// partA|needle|partB
$sE [ 0 ] = mb_substr ( $s , 0 , $p , $e );
$sE [ 1 ] = mb_substr ( $s , $p , $nL , $e );
$sE [ 2 ] = mb_substr ( $s , $p + $nL , $sL — $p — $nL , $e );
// mask
// partA|partB (needle not needed)
$mE [ 0 ] = mb_substr ( $m , 0 , $p , $e );
$mE [ 1 ] = mb_substr ( $m , $p + $nL , $sL — $p — $nL , $e );
// apply shears
$sE [ 1 ] = $rL . $sE [ 1 ]. $rR ;
// update sunject length
$sL += $rLL + $rRL ;
// update mask
$m = $mE [ 0 ] . str_repeat ( ‘1’ , $rLL + $nL + $rRL ) . $mE [ 1 ];
// implode into a subject
$s = implode ( $sE );
// update lowercase subject
$sW = mb_strtolower ( $s , $e );
// increase offset
$o += $rLL + $nL + $rRL ;
// end of string reached
if( $o >= $sL )
break;