Php входит ли подстрока в строку

(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().

Читайте также:  Powered by xtreme ws

Использование регулярных выражений

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

Но помните, что функция strpos() работает в три раза быстрее, чем регулярные выражения. Следующий пример демонстрирует, как с их помощью найти слово, символ в строке:

Использование функции preg_match() имеет смысл только при сложном поиске. Например, для проверки того, содержит ли строка слова с десятью и более символами и т.п. Пример:

Чтобы сделать поиск регистронезависимым, добавьте флаг i в конец шаблона. Пример реализации:

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

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

В подобных ситуациях лучше применять регулярные выражения. Можно использовать выражение b в шаблоне регулярного выражения, чтобы обозначить границу слова. Если слово, которое вы ищете, заключено в выражения b, функция preg_match() найдёт только точные вхождения слова и вернет FALSE для частичных совпадений. Вот пример:

Использование strstr() для поиска подстроки

PHP функция strstr() может быть использована для проверки вхождения символа или подстроки. Она возвращает часть исходной строки, начиная с первого вхождения искомого слова и до конца. Функция вернёт значение FALSE, если подстрока не найдена. Благодаря этому можно проверить, содержит ли строка подстроку. Вот пример:

Для регистронезависимого поиска используйте функцию stristr().

  1. Лучший метод поиска символа или слова в строке – PHP функции strpos(). Если нужно провести регистронезависимый поиск, применяйтеstripos(). Обе функции просты в использовании и работают быстрее остальных методов.
  2. Для сложного поиска используйте регулярные выражения. Вы также можете применять их для простого поиска, но они работают медленнее, чем функция strpos().
  3. Регулярные выражения полезны, когда вы ищете точное вхождение слова. Например, при поиске слова “сто” функция strpos() также вернёт значение TRUE, если строка содержит слово “Место”. С другой стороны, можно использовать выражение b в функции preg_match(), которая в таком случае возвратит FALSE.
  4. Используйте 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() .

Если этот параметр указан, то поиск будет начат с указанного количества символов с начала строки. Если задано отрицательное значение, отсчет позиции начала поиска будет произведен с конца строки.

Читайте также:  Vlc как закачать фильм на iphone

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

Возвращает позицию, в которой находится искомая строка, относительно начала строки 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;

Оцените статью
Добавить комментарий

Adblock
detector