Php как найти все вхождения подстроки

I need to parse an HTML document and to find all occurrences of string asdf in it.

I currently have the HTML loaded into a string variable. I would just like the character position so I can loop through the list to return some data after the string.

The strpos function only returns the first occurrence. How about returning all of them?

Salman A's user avatar

Salman A

259k82 gold badges428 silver badges520 bronze badges

asked Apr 1, 2013 at 3:55

muncherelli's user avatar

0

Without using regex, something like this should work for returning the string positions:

$html = "dddasdfdddasdffff";
$needle = "asdf";
$lastPos = 0;
$positions = array();

while (($lastPos = strpos($html, $needle, $lastPos))!== false) {
    $positions[] = $lastPos;
    $lastPos = $lastPos + strlen($needle);
}

// Displays 3 and 10
foreach ($positions as $value) {
    echo $value ."<br />";
}

trejder's user avatar

trejder

17k27 gold badges123 silver badges215 bronze badges

answered Apr 1, 2013 at 4:01

Adam Plocher's user avatar

Adam PlocherAdam Plocher

13.9k6 gold badges46 silver badges79 bronze badges

3

You can call the strpos function repeatedly until a match is not found. You must specify the offset parameter.

Note: in the following example, the search continues from the next character instead of from the end of previous match. According to this function, aaaa contains three occurrences of the substring aa, not two.

function strpos_all($haystack, $needle) {
    $offset = 0;
    $allpos = array();
    while (($pos = strpos($haystack, $needle, $offset)) !== FALSE) {
        $offset   = $pos + 1;
        $allpos[] = $pos;
    }
    return $allpos;
}
print_r(strpos_all("aaa bbb aaa bbb aaa bbb", "aa"));

Output:

Array
(
    [0] => 0
    [1] => 1
    [2] => 8
    [3] => 9
    [4] => 16
    [5] => 17
)

answered Dec 6, 2014 at 15:34

Salman A's user avatar

Salman ASalman A

259k82 gold badges428 silver badges520 bronze badges

Its better to use substr_count . Check out on php.net

answered Nov 14, 2013 at 11:42

Nirmal Ram's user avatar

Nirmal RamNirmal Ram

1,7124 gold badges24 silver badges45 bronze badges

2

function getocurence($chaine,$rechercher)
        {
            $lastPos = 0;
            $positions = array();
            while (($lastPos = strpos($chaine, $rechercher, $lastPos))!== false)
            {
                $positions[] = $lastPos;
                $lastPos = $lastPos + strlen($rechercher);
            }
            return $positions;
        }

answered Mar 8, 2014 at 15:32

Ryodo's user avatar

RyodoRyodo

4455 silver badges17 bronze badges

1

This can be done using strpos() function. The following code is implemented using for loop. This code is quite simple and pretty straight forward.

<?php

$str_test = "Hello World! welcome to php";

$count = 0;
$find = "o";
$positions = array();
for($i = 0; $i<strlen($str_test); $i++)
{
     $pos = strpos($str_test, $find, $count);
     if($pos == $count){
           $positions[] = $pos;
     }
     $count++;
}
foreach ($positions as $value) {
    echo '<br/>' .  $value . "<br />";
}

?>

answered Feb 4, 2014 at 16:56

Kach's user avatar

KachKach

1111 gold badge1 silver badge7 bronze badges

Use preg_match_all to find all occurrences.

preg_match_all('/($[a-z]+)/i', $str, $matches);

For further reference check this link.

trejder's user avatar

trejder

17k27 gold badges123 silver badges215 bronze badges

answered Apr 1, 2013 at 4:04

Deepu's user avatar

DeepuDeepu

11.8k15 gold badges58 silver badges89 bronze badges

1

Salman A has a good answer, but remember to make your code multibyte-safe. To get correct positions with UTF-8, use mb_strpos instead of strpos:

function strpos_all($haystack, $needle) {
    $offset = 0;
    $allpos = array();
    while (($pos = mb_strpos($haystack, $needle, $offset)) !== FALSE) {
        $offset   = $pos + 1;
        $allpos[] = $pos;
    }
    return $allpos;
}
print_r(strpos_all("aaa bbb aaa bbb aaa bbb", "aa"));

Umair Khan's user avatar

answered Apr 22, 2020 at 9:06

mangrove's user avatar

Another solution is to use explode():

public static function allSubStrPos($str, $del)
{
    $searchArray = explode($del, $str);
    unset($searchArray[count($searchArray) - 1]);
    $positionsArray = [];
    $index = 0;
    foreach ($searchArray as $i => $s) {
        array_push($positionsArray, strlen($s) + $index);
        $index += strlen($s) + strlen($del);
    }
    return $positionsArray;
}

answered May 8, 2021 at 22:59

Amin.Qarabaqi's user avatar

Simple strpos_all() function.

function strpos_all($haystack, $needle_regex)
{
    preg_match_all('/' . $needle_regex . '/', $haystack, $matches, PREG_OFFSET_CAPTURE);
    return array_map(function ($v) {
        return $v[1];
    }, $matches[0]);
}

Usage:
Simple string as needle.

$html = "dddasdfdddasdffff";
$needle = "asdf";

$all_positions = strpos_all($html, $needle);
var_dump($all_positions);

Output:

array(2) {
  [0]=>
  int(3)
  [1]=>
  int(10)
}

Or with regex as needle.

$html = "dddasdfdddasdffff";
$needle = "[d]{3}";

$all_positions = strpos_all($html, $needle);
var_dump($all_positions);

Output:

array(2) {
  [0]=>
  int(0)
  [1]=>
  int(7)
}

answered Apr 10, 2020 at 16:07

Jalo's user avatar

JaloJalo

314 bronze badges

2

<?php
$mainString = "dddjmnpfdddjmnpffff";
$needle = "jmnp";
$lastPos = 0;
$positions = array();

while (($lastPos = strpos($html, $needle, $lastPos))!== false) {
    $positions[] = $lastPos;
    $lastPos = $lastPos + strlen($needle);
}

// Displays 3 and 10
foreach ($positions as $value) {
    echo $value ."<br />";
}
?>

answered Jul 20, 2020 at 17:01

Dr. Nio's user avatar

Обзор PHP-функций для работы со строками и практическое их применение с учетом кодировки UTF-8.

1

Количество символов

Получить длину строки

Функция strlen($string) возвращает длину строки, но возвращает неправильный результат если в строке есть кириллица в UTF-8, поэтому нужно использовать mb_strlen().

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';

echo strlen($text); // 105
echo mb_strlen($text); // 59

PHP

Количество символов без пробелов

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_ereg_replace('[s]', '', $text);
echo mb_strlen($str); // 49

PHP

Количество слов с строке

Функция str_word_count() возвращает количество слов в строке, но символы обрамленные пробелами будет считаться за слово, например « – ». Так же функция не работает с UTF-8, как видно в примере:

$text = 'Lorem Ipsum - is simply dummy!';
echo str_word_count($text); // 6

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo str_word_count($text); // 1

PHP

Рабочий вариант:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[[:punct:]]/", '', $text);
$str = mb_ereg_replace('[s]+', ' ', $str);
$words = explode(' ', $str);
echo count($words); // 10

PHP

Получить количество переносов в строке

$text = 'Съешь ещё - этих 
мягких французских булок, 
да выпей же чаю.';

echo substr_count($text, PHP_EOL); // 2

PHP

Количество букв в строке

$text = 'Съешь ещё этих мягких французских булок, да выпей же чаю.';
echo $str = preg_replace('/[^a-zа-яё]/ui', '', $text);
echo mb_strlen($str); // 46

PHP

Количество цифр в строке

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace('/[^0-9]/ui', '', $text);
echo mb_strlen($str); // 0

PHP

Количество знаков препинания

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = preg_replace("/[^[:punct:]]/", '', $text);
echo mb_strlen($str); // 3

PHP

Количество пробелов в строке

Или количество вхождений любого другого символа или подстроки.

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo substr_count($text, ' '); // 10

PHP

Количество пробелов в начале строки:

$text = '     Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strlen($text) - mb_strlen(ltrim($text, ' ')); // 5

PHP

Количество пробелов в конце строки:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.   ';
echo mb_strlen($text) - mb_strlen(rtrim($text, ' ')); // 3

PHP

2

Поиск

Получить количество вхождений подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_substr_count($text, 'ещё'); // 2

PHP

Найти позицию первого вхождения подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strpos($text, 'ещё'); // 6

// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_stripos($text, 'ещё'); // 6

PHP

Найти позицию последнего вхождения подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strrpos($text, 'ещё'); // 46

// Без учета регистра:
$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';
echo mb_strirpos($text, 'ещё'); // 46

PHP

Найти все вхождения подстроки

$text = 'Съешь ещё - этих мягких французских булок, да ещё выпей же чаю.';

$offset = 0;
$allpos = array();
while (($pos = mb_strpos($text, 'ещё', $offset)) !== false) {
	$offset   = $pos + 1;
	$allpos[] = $pos;
}

print_r($allpos); // Array ([0] => 6 [1] => 46)

PHP

3

Извлечение из текста

Начало строки

Получить первый символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 1); // С

PHP

Получить три первых символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, 3); // Съе

PHP

Получить первое слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', true); // Съешь

PHP

Получить все после первого слова:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_strstr($text, ' ', false); // ещё - этих мягких французских булок, да выпей же чаю.

PHP

Конец строки

Получить последний символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 1); // .

PHP

Получить три последних символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, -1, 3); // аю.

PHP

Получить последнее слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo end($array); // чаю.

PHP

Получить всё до последнего слова:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $str; // Съешь ещё - этих мягких французских булок, да выпей же

PHP

Середина строки

Получить второе слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$array = explode(' ', $text);
echo $array[1]; // ещё

PHP

Получить текст до дефиса:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
echo mb_substr($text, 0, mb_strpos($text, ' - ')); // Съешь ещё

PHP

Получить текст после дефиса:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$str = mb_substr($text, mb_strpos($text, ' - ') + mb_strlen(' - '), -1);
echo $str; // этих мягких французских булок, да выпей же чаю

PHP

Переносы строк

Получить первую строку:

$text = 'Разнообразный опыт укрепление и развитие структуры требуют 
определения направлений прогрессивного развития! Не следует забывать, 
что постоянный рост и сфера активности в  степени обуславливает создание 
системы обучения кадров? С другой стороны дальнейшее развитие различных 
форм влечет за собой процесс внедрения и модернизации.';

$pos = mb_strpos($text, "n");
$str = trim(mb_substr($text, 0, $pos));
echo $str; // Разнообразный опыт укрепление и развитие структуры требуют 

// или
$lines = explode("n", $text);
echo $lines[0]; // Разнообразный опыт укрепление и развитие структуры требуют 

PHP

Получить последнюю строку:

$text = 'Разнообразный опыт укрепление и развитие структуры требуют 
определения направлений прогрессивного развития! Не следует забывать, 
что постоянный рост и сфера активности в  степени обуславливает создание 
системы обучения кадров? С другой стороны дальнейшее развитие различных 
форм влечет за собой процесс внедрения и модернизации.';

$pos = mb_strrpos($text, "n");
$str = trim(mb_substr($text, $pos));
echo $str; // форм влечет за собой процесс внедрения и модернизации.

// или
$lines = explode("n", $text);
echo end($lines); // форм влечет за собой процесс внедрения и модернизации.

PHP

Пилучить символы из ковычек и скобок

$text = ''Съешь' "ещё" «этих» [мягких] (французских) {булок} <да>';

// '...'
preg_match_all("/'(.+?)'/", $text, $matches);
echo $matches[1][0]; // Съешь

// "..."
preg_match_all("/"(.+?)"/", $text, $matches);
echo $matches[1][0]; // ещё

// «...»
preg_match_all("/«(.+?)»/", $text, $matches);
echo $matches[1][0]; // этих

// [...]
preg_match_all("/[(.+?)]/", $text, $matches);
echo $matches[1][0]; // мягких

// (...)
preg_match_all("/((.+?))/", $text, $matches);
echo $matches[1][0]; // французских

// {...}
preg_match_all("/{(.+?)}/", $text, $matches);
echo $matches[1][0]; // булок

// <...>
preg_match_all("/<(.+?)>/", $text, $matches);
echo $matches[1][0]; // да

PHP

4

Замена в строках

Функция substr_replace($search, $replace, $subject, $count) – заменяет часть строки, также не раотает с кирилицей в кодировке UTF-8, в библиатеке mb_string её нет, поэтому приходится использовать пользовольскую функцию:

if (!function_exists('mb_substr_replace')) {
	function mb_substr_replace($original, $replacement, $position, $length)
	{
		$startString = mb_substr($original, 0, $position, 'UTF-8');
		$endString = mb_substr($original, $position + $length, mb_strlen($original), 'UTF-8');
		$out = $startString . $replacement . $endString;
		return $out;
	}
}

PHP

Заменить первый символ:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', 0, 1); // !ъешь ещё - этих мягких французских булок.

PHP

Заменить три первых символа:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', 0, 3); // !!!шь ещё - этих мягких французских булок.

PHP

Заменить последний символ:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!', -1, 0); // Съешь ещё - этих мягких французских булок!

PHP

Заменить три последних символа:

$text = 'Съешь ещё - этих мягких французских булок.';
echo mb_substr_replace($text, '!!!', -3, 0); // Съешь ещё - этих мягких французских бул!!!

PHP

Замена символов и слов в строке

Для этой задачи подходит функция str_replace($search, $replace, $subject), которая работает со всеми кодировками.

Заменить пробелы:

$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace(' ', '-', $text); // Съешь-ещё---этих-мягких-французских-булок.

PHP

Заменить слово:

$text = 'Съешь ещё - этих мягких французских булок.';
echo str_replace('мягких', 'твердых', $text); // Съешь ещё - этих твердых французских булок.

PHP

Заменить всё до дефиса:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = 'Не ешь' . mb_substr($text, mb_strpos($text, ' - '), -1);
echo $str; // Не ешь - этих мягких французских булок

PHP

Заменить всё после дефиса:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = mb_substr($text, 0, mb_strpos($text, ' - ') + 3) . 'печенек';
echo $str; // Съешь ещё - печенек

PHP

5

Добавление в строки

Добавить строку после 10-го символа:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = mb_substr_replace($text, '!!!', 10, 0);
echo $str; // Съешь ещё !!!- этих мягких французских булок.

PHP

Добавить перед словом:

$text = 'Съешь ещё - этих мягких французских булок.';

$str = str_replace(' ещё ', ' же ещё ', $text); 
echo $str; // Съешь же ещё - этих мягких французских булок.

PHP

Добавить после слова:

$text = 'Съешь ещё - этих мягких французских булок.';
$str = str_replace(' ещё ', ' ещё немного ', $text); 
echo $str; // Съешь ещё немного - этих мягких французских булок.

PHP

Вставить строку между всех символов

Для того чтобы вставить символ между всех символов в строке понадобится функция str_split($string) для пробразавания строки в массив, она также не работает с кирилицей. С версии PHP 7.4 появилась функция mb_str_split(), для более ранних версий:

if (!function_exists('mb_str_split')) {
	function mb_str_split($str, $l = 0) {
		if ($l > 0) {
			$ret = array();
			$len = mb_strlen($str, "UTF-8");
			for ($i = 0; $i < $len; $i += $l) {
				$ret[] = mb_substr($str, $i, $l, "UTF-8");
			}
			return $ret;
		}
		return preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
	}
}

PHP

$text = 'Съешь ещё - этих мягких французских булок.';

$array = mb_str_split($text);;
$new = implode(' ', $array);
echo $new; // С ъ е ш ь   е щ ё   -   э т и х   м я г к и х   ф р а н ц у з с к и х   б у л о к .

PHP

Дописать строку до нужной длины

Функция str_pad($string, $length, $pad_string, $pad_type) дополняет строку другой строкой до заданной длины.

Версия функции для UTF-8:

if (!function_exists('mb_str_pad')) {
	function mb_str_pad($input, $pad_length, $pad_string = ' ', $pad_type = STR_PAD_RIGHT)
	{
		$diff = strlen($input) - mb_strlen($input);
		return str_pad($input, $pad_length + $diff, $pad_string, $pad_type);
	}
}

PHP

Дописать стркуку слева:

$text = 'Привет Мир';
echo mb_str_pad($text,  20, '-', STR_PAD_LEFT); // ----------Привет Мир

PHP

Дописать строку справа:

$text = 'Привет Мир';
echo mb_str_pad($text,  20, '-', STR_PAD_RIGHT); // Привет Мир----------

PHP

Дописать строку с обеих сторон:

$text = 'Привет Мир';
echo mb_str_pad($text,  20, '-', STR_PAD_BOTH); // -----Привет Мир-----

PHP

6

Удаление из строк

Удаление в начале строки

Удалить первый символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 1);
echo $new; // ъешь ещё - этих мягких французских булок, да выпей же чаю.

PHP

Удалить первые 3 символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 3);
echo $new; // шь ещё - этих мягких французских булок, да выпей же чаю.

PHP

Удалить первое слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, mb_strpos($text, ' '));
echo $new; // ещё - этих мягких французских булок, да выпей же чаю.

PHP

Удаление в конце строки

Удалить последний символ:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -1);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же чаю

PHP

Удалить три последних символа:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, -3);
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же ч

PHP

Удалить последнее слово:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = mb_substr($text, 0, mb_strrpos($text, ' '));
echo $new; // Съешь ещё - этих мягких французских булок, да выпей же

PHP

Удаление подсторк

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = str_replace(' мягких', '', $text);
echo $new; // Съешь ещё - этих французских булок, да выпей же чаю.

PHP

Удалить всё перед сиволом:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = strstr($text, '-'); 
echo $new; // - этих мягких французских булок, да выпей же чаю.

PHP

Удалить всё после сивола:

$text = 'Съешь ещё - этих мягких французских булок, да выпей же чаю.';
$new = strstr($text, '-', true); 
echo $new; // Съешь ещё

// Второй вариант:
$pos = mb_strpos($text, '-');
$new = mb_substr($text, 0, $pos + 1);
echo $new; // Съешь ещё -

PHP

(PHP 4, PHP 5, PHP 7, PHP 8)

strposFind the position of the first occurrence of a substring in a string

Description

strpos(string $haystack, string $needle, int $offset = 0): int|false

Parameters

haystack

The string to search in.

needle

Prior to PHP 8.0.0, if needle is not a string, it is converted
to an integer and applied as the ordinal value of a character.
This behavior is deprecated as of PHP 7.3.0, and relying on it is highly
discouraged. Depending on the intended behavior, the
needle should either be explicitly cast to string,
or an explicit call to chr() should be performed.

offset

If specified, search will start this number of characters counted from
the beginning of the string. If the offset is negative, the search will start
this number of characters counted from the end of the string.

Return Values

Returns the position of where the needle exists relative to the beginning of
the haystack string (independent of offset).
Also note that string positions start at 0, and not 1.

Returns false if the needle was not found.

Warning

This function may
return Boolean false, but may also return a non-Boolean value which
evaluates to false. Please read the section on Booleans for more
information. Use the ===
operator for testing the return value of this
function.

Changelog

Version Description
8.0.0 Passing an int as needle is no longer supported.
7.3.0 Passing an int as needle has been deprecated.
7.1.0 Support for negative offsets has been added.

Examples

Example #1 Using ===


<?php
$mystring
= 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);// Note our use of ===. Simply == would not work as expected
// because the position of 'a' was the 0th (first) character.
if ($pos === false) {
echo
"The string '$findme' was not found in the string '$mystring'";
} else {
echo
"The string '$findme' was found in the string '$mystring'";
echo
" and exists at position $pos";
}
?>

Example #2 Using !==


<?php
$mystring
= 'abc';
$findme = 'a';
$pos = strpos($mystring, $findme);// The !== operator can also be used. Using != would not work as expected
// because the position of 'a' is 0. The statement (0 != false) evaluates
// to false.
if ($pos !== false) {
echo
"The string '$findme' was found in the string '$mystring'";
echo
" and exists at position $pos";
} else {
echo
"The string '$findme' was not found in the string '$mystring'";
}
?>

Example #3 Using an offset


<?php
// We can search for the character, ignoring anything before the offset
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, not 0
?>

Notes

Note: This function is
binary-safe.

See Also

  • stripos() – Find the position of the first occurrence of a case-insensitive substring in a string
  • str_contains() – Determine if a string contains a given substring
  • str_ends_with() – Checks if a string ends with a given substring
  • str_starts_with() – Checks if a string starts with a given substring
  • strrpos() – Find the position of the last occurrence of a substring in a string
  • strripos() – Find the position of the last occurrence of a case-insensitive substring in a string
  • strstr() – Find the first occurrence of a string
  • strpbrk() – Search a string for any of a set of characters
  • substr() – Return part of a string
  • preg_match() – Perform a regular expression match

Suggested re-write for pink WARNING box

15 years ago


WARNING

As strpos may return either FALSE (substring absent) or 0 (substring at start of string), strict versus loose equivalency operators must be used very carefully.

To know that a substring is absent, you must use: 

=== FALSE

To know that a substring is present (in any position including 0), you can use either of:

!== FALSE  (recommended)
> -1  (note: or greater than any negative number)

To know that a substring is at the start of the string, you must use: 

=== 0

To know that a substring is in any position other than the start, you can use any of:

> 0  (recommended)
!= 0  (note: but not !== 0 which also equates to FALSE)
!= FALSE  (disrecommended as highly confusing)

Also note that you cannot compare a value of "" to the returned value of strpos. With a loose equivalence operator (== or !=) it will return results which don't distinguish between the substring's presence versus position. With a strict equivalence operator (=== or !==) it will always return false.


martijn at martijnfrazer dot nl

11 years ago


This is a function I wrote to find all occurrences of a string, using strpos recursively.

<?php
function strpos_recursive($haystack, $needle, $offset = 0, &$results = array()) {               
   
$offset = strpos($haystack, $needle, $offset);
    if(
$offset === false) {
        return
$results;           
    } else {
       
$results[] = $offset;
        return
strpos_recursive($haystack, $needle, ($offset + 1), $results);
    }
}
?>

This is how you use it:

<?php
$string
= 'This is some string';
$search = 'a';
$found = strpos_recursive($string, $search);

if(

$found) {
    foreach(
$found as $pos) {
        echo
'Found "'.$search.'" in string "'.$string.'" at position <b>'.$pos.'</b><br />';
    }   
} else {
    echo
'"'.$search.'" not found in "'.$string.'"';
}
?>


fabio at naoimporta dot com

7 years ago


It is interesting to be aware of the behavior when the treatment of strings with characters using different encodings.

<?php
# Works like expected. There is no accent
var_dump(strpos("Fabio", 'b'));
#int(2)

# The "á" letter is occupying two positions

var_dump(strpos("Fábio", 'b')) ;
#int(3)

# Now, encoding the string "Fábio" to utf8, we get some "unexpected" outputs. Every letter that is no in regular ASCII table, will use 4 positions(bytes). The starting point remains like before.
# We cant find the characted, because the haystack string is now encoded.

var_dump(strpos(utf8_encode("Fábio"), 'á'));
#bool(false)

# To get the expected result, we need to encode the needle too

var_dump(strpos(utf8_encode("Fábio"), utf8_encode('á')));
#int(1)

# And, like said before, "á" occupies 4 positions(bytes)

var_dump(strpos(utf8_encode("Fábio"), 'b'));
#int(5)


mtroy dot student at gmail dot com

11 years ago


when you want to know how much of substring occurrences, you'll use "substr_count".
But, retrieve their positions, will be harder.
So, you can do it by starting with the last occurrence :

function strpos_r($haystack, $needle)
{
    if(strlen($needle) > strlen($haystack))
        trigger_error(sprintf("%s: length of argument 2 must be <= argument 1", __FUNCTION__), E_USER_WARNING);

    $seeks = array();
    while($seek = strrpos($haystack, $needle))
    {
        array_push($seeks, $seek);
        $haystack = substr($haystack, 0, $seek);
    }
    return $seeks;
}

it will return an array of all occurrences a the substring in the string

Example :

$test = "this is a test for testing a test function... blah blah";
var_dump(strpos_r($test, "test"));

// output

array(3) {
  [0]=>
  int(29)
  [1]=>
  int(19)
  [2]=>
  int(10)
}

Paul-antoine
Malézieux.


rjeggens at ijskoud dot org

11 years ago


I lost an hour before I noticed that strpos only returns FALSE as a boolean, never TRUE.. This means that

strpos() !== false

is a different beast then:

strpos() === true

since the latter will never be true. After I found out, The warning in the documentation made a lot more sense.


m.m.j.kronenburg

6 years ago


<?php/**
* Find the position of the first occurrence of one or more substrings in a
* string.
*
* This function is simulair to function strpos() except that it allows to
* search for multiple needles at once.
*
* @param string $haystack    The string to search in.
* @param mixed $needles      Array containing needles or string containing
*                            needle.
* @param integer $offset     If specified, search will start this number of
*                            characters counted from the beginning of the
*                            string.
* @param boolean $last       If TRUE then the farthest position from the start
*                            of one of the needles is returned.
*                            If FALSE then the smallest position from start of
*                            one of the needles is returned.
**/
function mstrpos($haystack, $needles, $offset = 0, $last = false)
{
  if(!
is_array($needles)) { $needles = array($needles); }
 
$found = false;
  foreach(
$needles as $needle)
  {
   
$position = strpos($haystack, (string)$needle, $offset);
    if(
$position === false) { continue; }
   
$exp = $last ? ($found === false || $position > $found) :
      (
$found === false || $position < $found);
    if(
$exp) { $found = $position; }
  }
  return
$found;
}
/**
* Find the position of the first (partially) occurrence of a substring in a
* string.
*
* This function is simulair to function strpos() except that it wil return a
* position when the substring is partially located at the end of the string.
*
* @param string $haystack    The string to search in.
* @param mixed $needle       The needle to search for.
* @param integer $offset     If specified, search will start this number of
*                            characters counted from the beginning of the
*                            string.
**/
function pstrpos($haystack, $needle, $offset = 0)
{
 
$position = strpos($haystack, $needle, $offset);
  if(
$position !== false) { return $position; }

    for(

$i = strlen($needle); $i > 0; $i--)
  {
    if(
substr($needle, 0, $i) == substr($haystack, -$i))
    { return
strlen($haystack) - $i; }
  }
  return
false;
}
/**
* Find the position of the first (partially) occurrence of one or more
* substrings in a string.
*
* This function is simulair to function strpos() except that it allows to
* search for multiple needles at once and it wil return a position when one of
* the substrings is partially located at the end of the string.
*
* @param string $haystack    The string to search in.
* @param mixed $needles      Array containing needles or string containing
*                            needle.
* @param integer $offset     If specified, search will start this number of
*                            characters counted from the beginning of the
*                            string.
* @param boolean $last       If TRUE then the farthest position from the start
*                            of one of the needles is returned.
*                            If FALSE then the smallest position from start of
*                            one of the needles is returned.
**/
function mpstrpos($haystack, $needles, $offset = 0, $last = false)
{
  if(!
is_array($needles)) { $needles = array($needles); }
 
$found = false;
  foreach(
$needles as $needle)
  {
   
$position = pstrpos($haystack, (string)$needle, $offset);
    if(
$position === false) { continue; }
   
$exp = $last ? ($found === false || $position > $found) :
      (
$found === false || $position < $found);
    if(
$exp) { $found = $position; }
  }
  return
$found;
}
?>

jexy dot ru at gmail dot com

6 years ago


Docs are missing that WARNING is issued if needle is '' (empty string).

In case of empty haystack it just return false:

For example:

<?php
var_dump
(strpos('foo', ''));var_dump(strpos('', 'foo'));var_dump(strpos('', ''));
?>

will output:

Warning: strpos(): Empty needle in /in/lADCh on line 3
bool(false)

bool(false)

Warning: strpos(): Empty needle in /in/lADCh on line 7
bool(false)

Note also that warning text may differ depending on php version, see https://3v4l.org/lADCh


greg at spotx dot net

5 years ago


Warning:
this is not unicode safe

strpos($word,'?') in e?ez-> 1
strpos($word,'?') in è?ent-> 2


usulaco at gmail dot com

12 years ago


Parse strings between two others in to array.

<?php

function g($string,$start,$end){

    
preg_match_all('/' . preg_quote($start, '/') . '(.*?)'. preg_quote($end, '/').'/i', $string, $m);

    
$out = array();

     foreach(

$m[1] as $key => $value){

      
$type = explode('::',$value);

       if(
sizeof($type)>1){

          if(!
is_array($out[$type[0]]))

            
$out[$type[0]] = array();

         
$out[$type[0]][] = $type[1];

       } else {

         
$out[] = $value;

       }

     }

  return
$out;

}

print_r(g('Sample text, [/text to extract/] Rest of sample text [/WEB::http://google.com/] bla bla bla. ','[/','/]'));

?>



results:

Array

(

    [0] => text to extract

    [WEB] => Array

        (

            [0] => http://google.com

        )

)

Can be helpfull to custom parsing :)


akarmenia at gmail dot com

12 years ago


My version of strpos with needles as an array. Also allows for a string, or an array inside an array.

<?php
function strpos_array($haystack, $needles) {
    if (
is_array($needles) ) {
        foreach (
$needles as $str) {
            if (
is_array($str) ) {
               
$pos = strpos_array($haystack, $str);
            } else {
               
$pos = strpos($haystack, $str);
            }
            if (
$pos !== FALSE) {
                return
$pos;
            }
        }
    } else {
        return
strpos($haystack, $needles);
    }
}
// Test
echo strpos_array('This is a test', array('test', 'drive')); // Output is 10?>


eef dot vreeland at gmail dot com

6 years ago


To prevent others from staring at the text, note that the wording of the 'Return Values' section is ambiguous.

Let's say you have a string $myString containing 50 'a's except on position 3 and 43, they contain 'b'.
And for this moment, forget that counting starts from 0.

strpos($myString, 'b', 40) returns 43, great.

And now the text: "Returns the position of where the needle exists relative to the beginning of the haystack string (independent of offset)."

So it doesn't really matter what offset I specify; I'll get the REAL position of the first occurrence in return, which is 3?

... no ...

"independent of offset" means, you will get the REAL positions, thus, not relative to your starting point (offset).

Substract your offset from strpos()'s answer, then you have the position relative to YOUR offset.


ohcc at 163 dot com

8 years ago


Be careful when the $haystack or $needle parameter is an integer.
If you are not sure of its type, you should  convert it into a string.
<?php
    var_dump
(strpos(12345,1));//false
   
var_dump(strpos(12345,'1'));//0
   
var_dump(strpos('12345',1));//false
   
var_dump(strpos('12345','1'));//0
   
$a = 12345;
   
$b = 1;
   
var_dump(strpos(strval($a),strval($b)));//0
   
var_dump(strpos((string)$a,(string)$b));//0   
?>

ilaymyhat-rem0ve at yahoo dot com

15 years ago


This might be useful.

<?php

class String{
//Look for a $needle in $haystack in any position

   
public static function contains(&$haystack, &$needle, &$offset)

    {

       
$result = strpos($haystack, $needle, $offset);

        return
$result !== FALSE;

    }
//intuitive implementation .. if not found returns -1.

   
public static function strpos(&$haystack, &$needle, &$offset)

    {

       
$result = strpos($haystack, $needle, $offset);

        if (
$result === FALSE )

        {

            return -
1;

        }

        return
$result;

    }

   
}

//String

?>


yasindagli at gmail dot com

13 years ago


This function finds postion of nth occurence of a letter starting from offset.

<?php
function nth_position($str, $letter, $n, $offset = 0){
   
$str_arr = str_split($str);
   
$letter_size = array_count_values(str_split(substr($str, $offset)));
    if( !isset(
$letter_size[$letter])){
       
trigger_error('letter "' . $letter . '" does not exist in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
        return
false;
    } else if(
$letter_size[$letter] < $n) {
       
trigger_error('letter "' . $letter . '" does not exist ' . $n .' times in ' . $str . ' after ' . $offset . '. position', E_USER_WARNING);
        return
false;
    }
    for(
$i = $offset, $x = 0, $count = (count($str_arr) - $offset); $i < $count, $x != $n; $i++){
        if(
$str_arr[$i] == $letter){
           
$x++;
        }
    }
    return
$i - 1;
}

echo

nth_position('foobarbaz', 'a', 2); //7
echo nth_position('foobarbaz', 'b', 1, 4); //6
?>


bishop

19 years ago


Code like this:
<?php
if (strpos('this is a test', 'is') !== false) {
    echo
"found it";
}
?>

gets repetitive, is not very self-explanatory, and most people handle it incorrectly anyway. Make your life easier:

<?php
function str_contains($haystack, $needle, $ignoreCase = false) {
    if (
$ignoreCase) {
       
$haystack = strtolower($haystack);
       
$needle   = strtolower($needle);
    }
   
$needlePos = strpos($haystack, $needle);
    return (
$needlePos === false ? false : ($needlePos+1));
}
?>

Then, you may do:
<?php
// simplest use
if (str_contains('this is a test', 'is')) {
    echo
"Found it";
}
// when you need the position, as well whether it's present
$needlePos = str_contains('this is a test', 'is');
if (
$needlePos) {
    echo
'Found it at position ' . ($needlePos-1);
}
// you may also ignore case
$needlePos = str_contains('this is a test', 'IS', true);
if (
$needlePos) {
    echo
'Found it at position ' . ($needlePos-1);
}
?>


Jean

4 years ago


When a value can be of "unknow" type, I find this conversion trick usefull and more readable than a formal casting (for php7.3+):

<?php
$time
= time();
$string = 'This is a test: ' . $time;
echo (
strpos($string, $time) !== false ? 'found' : 'not found');
echo (
strpos($string, "$time") !== false ? 'found' : 'not found');
?>


Anonymous

10 years ago


The most straightforward way to prevent this function from returning 0 is:

  strpos('x'.$haystack, $needle, 1)

The 'x' is simply a garbage character which is only there to move everything 1 position.
The number 1 is there to make sure that this 'x' is ignored in the search.
This way, if $haystack starts with $needle, then the function returns 1 (rather than 0).


marvin_elia at web dot de

5 years ago


Find position of nth occurrence of a string:

    function strpos_occurrence(string $string, string $needle, int $occurrence, int $offset = null) {
        if((0 < $occurrence) && ($length = strlen($needle))) {
            do {
            } while ((false !== $offset = strpos($string, $needle, $offset)) && --$occurrence && ($offset += $length));
            return $offset;
        }
        return false;
    }


digitalpbk [at] gmail.com

13 years ago


This function raises a warning if the offset is not between 0 and the length of string:

Warning: strpos(): Offset not contained in string in %s on line %d


Achintya

13 years ago


A function I made to find the first occurrence of a particular needle not enclosed in quotes(single or double). Works for simple nesting (no backslashed nesting allowed).

<?php

function strposq($haystack, $needle, $offset = 0){

   
$len = strlen($haystack);

   
$charlen = strlen($needle);

   
$flag1 = false;

   
$flag2 = false;

    for(
$i = $offset; $i < $len; $i++){

        if(
substr($haystack, $i, 1) == "'"){

           
$flag1 = !$flag1 && !$flag2 ? true : false;

        }

        if(
substr($haystack, $i, 1) == '"'){

           
$flag2 = !$flag1 && !$flag2 ? true : false;

        }

        if(
substr($haystack, $i, $charlen) == $needle && !$flag1 && !$flag2){

            return
$i;       

        }

    }

    return
false;

}

echo

strposq("he'llo'character;"'som"e;crap", ";"); //16

?>


spinicrus at gmail dot com

16 years ago


if you want to get the position of a substring relative to a substring of your string, BUT in REVERSE way:

<?phpfunction strpos_reverse_way($string,$charToFind,$relativeChar) {
   
//
   
$relativePos = strpos($string,$relativeChar);
   
$searchPos = $relativePos;
   
$searchChar = '';
   
//
   
while ($searchChar != $charToFind) {
       
$newPos = $searchPos-1;
       
$searchChar = substr($string,$newPos,strlen($charToFind));
       
$searchPos = $newPos;
    }
   
//
   
if (!empty($searchChar)) {
       
//
       
return $searchPos;
        return
TRUE;
    }
    else {
        return
FALSE;
    }
   
//
}?>


lairdshaw at yahoo dot com dot au

8 years ago


<?php
/*
* A strpos variant that accepts an array of $needles - or just a string,
* so that it can be used as a drop-in replacement for the standard strpos,
* and in which case it simply wraps around strpos and stripos so as not
* to reduce performance.
*
* The "m" in "strposm" indicates that it accepts *m*ultiple needles.
*
* Finds the earliest match of *all* needles. Returns the position of this match
* or false if none found, as does the standard strpos. Optionally also returns
* via $match either the matching needle as a string (by default) or the index
* into $needles of the matching needle (if the STRPOSM_MATCH_AS_INDEX flag is
* set).
*
* Case-insensitive searching can be specified via the STRPOSM_CI flag.
* Note that for case-insensitive searches, if the STRPOSM_MATCH_AS_INDEX is
* not set, then $match will be in the haystack's case, not the needle's case,
* unless the STRPOSM_NC flag is also set.
*
* Flags can be combined using the bitwise or operator,
* e.g. $flags = STRPOSM_CI|STRPOSM_NC
*/
define('STRPOSM_CI'            , 1); // CI => "case insensitive".
define('STRPOSM_NC'            , 2); // NC => "needle case".
define('STRPOSM_MATCH_AS_INDEX', 4);
function
strposm($haystack, $needles, $offset = 0, &$match = null, $flags = 0) {
   
// In the special case where $needles is not an array, simply wrap
    // strpos and stripos for performance reasons.
   
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)
                         ?
$needles
                        
: substr($haystack, $pos, strlen($needles))
                        )
                      );
            return
$pos;
        } else    goto
strposm_no_match;
    }
// $needles is an array. Proceed appropriately, initially by...
    // ...escaping regular expression meta characters in the needles.
   
$needles_esc = array_map('preg_quote', $needles);
   
// If either of the "needle case" or "match as index" flags are set,
    // then create a sub-match for each escaped needle by enclosing it in
    // parentheses. We use these later to find the index of the matching
    // needle.
   
if (($flags & STRPOSM_NC) || ($flags & STRPOSM_MATCH_AS_INDEX)) {
       
$needles_esc = array_map(
            function(
$needle) {return '('.$needle.')';},
           
$needles_esc
       
);
    }
   
// Create the regular expression pattern to search for all needles.
   
$pattern = '('.implode('|', $needles_esc).')';
   
// If the "case insensitive" flag is set, then modify the regular
    // expression with "i", meaning that the match is "caseless".
   
if ($flags & STRPOSM_CI) $pattern .= 'i';
   
// Find the first match, including its offset.
   
if (preg_match($pattern, $haystack, $matches, PREG_OFFSET_CAPTURE, $offset)) {
       
// Pull the first entry, the overall match, out of the matches array.
       
$found = array_shift($matches);
       
// If we need the index of the matching needle, then...
       
if (($flags & STRPOSM_NC) || ($flags & STRPOSM_MATCH_AS_INDEX)) {
           
// ...find the index of the sub-match that is identical
            // to the overall match that we just pulled out.
            // Because sub-matches are in the same order as needles,
            // this is also the index into $needles of the matching
            // needle.
           
$index = array_search($found, $matches);
        }
       
// If the "match as index" flag is set, then return in $match
        // the matching needle's index, otherwise...
       
$match = (($flags & STRPOSM_MATCH_AS_INDEX)
          ?
$index
         
// ...if the "needle case" flag is set, then index into
          // $needles using the previously-determined index to return
          // in $match the matching needle in needle case, otherwise...
         
: (($flags & STRPOSM_NC)
             ?
$needles[$index]
            
// ...by default, return in $match the matching needle in
             // haystack case.
            
: $found[0]
          )
        );
       
// Return the captured offset.
       
return $found[1];
    }
strposm_no_match:
   
// Nothing matched. Set appropriate return values.
   
$match = ($flags & STRPOSM_MATCH_AS_INDEX) ? false : null;
    return
false;
}
?>

qrworld.net

8 years ago


I found a function in this post http://softontherocks.blogspot.com/2014/11/buscar-multiples-textos-en-un-texto-con.html
that implements the search in both ways, case sensitive or case insensitive, depending on an input parameter.

The function is:

function getMultiPos($haystack, $needles, $sensitive=true, $offset=0){
    foreach($needles as $needle) {
        $result[$needle] = ($sensitive) ? strpos($haystack, $needle, $offset) : stripos($haystack, $needle, $offset);
    }
    return $result;
}

It was very useful for me.


Lurvik

9 years ago


Don't know if already posted this, but if I did this is an improvement.

This function will check if a string contains  a needle. It _will_ work with arrays and multidimensional arrays (I've tried with a > 16 dimensional array and had no problem).

<?php
function str_contains($haystack, $needles)
{
   
//If needles is an array
   
if(is_array($needles))
    {
       
//go trough all the elements
       
foreach($needles as $needle)
        {
           
//if the needle is also an array (ie needles is a multidimensional array)
           
if(is_array($needle))
            {
               
//call this function again
               
if(str_contains($haystack, $needle))
                {
                   
//Will break out of loop and function.
                   
return true;
                }

                                return

false;
            }
//when the needle is NOT an array:
                //Check if haystack contains the needle, will ignore case and check for whole words only
           
elseif(preg_match("/b$needleb/i", $haystack) !== 0)
            {
                return
true;
            }
        }
    }
   
//if $needles is not an array...
   
else
    {
        if(
preg_match("/b$needlesb/i", $haystack) !== 0)
        {
            return
true;
        }
    }

    return

false;
}
?>


gambajaja at yahoo dot com

12 years ago


<?php
$my_array
= array ('100,101', '200,201', '300,301');
$check_me_in = array ('100','200','300','400');
foreach (
$check_me_in as $value_cmi){
   
$is_in=FALSE; #asume that $check_me_in isn't in $my_array
   
foreach ($my_array as $value_my){
       
$pos = strpos($value_my, $value_cmi);
        if (
$pos===0)
           
$pos++;
        if (
$pos==TRUE){
           
$is_in=TRUE;
           
$value_my2=$value_my;
            }
    }
    if (
$is_in) echo "ID $value_cmi in $check_me_in I found in value '$value_my2' n";
}
?>

The above example will output
ID 100 in $check_me_in I found in value '100,101'
ID 200 in $check_me_in I found in value '200,201'
ID 300 in $check_me_in I found in value '300,301'

ah dot d at hotmail dot com

13 years ago


A strpos modification to return an array of all the positions of a needle in the haystack

<?php

function strallpos($haystack,$needle,$offset = 0){

   
$result = array();

    for(
$i = $offset; $i<strlen($haystack); $i++){

       
$pos = strpos($haystack,$needle,$i);

        if(
$pos !== FALSE){

           
$offset $pos;

            if(
$offset >= $i){

               
$i = $offset;

               
$result[] = $offset;

            }

        }

    }

    return
$result;

}

?>



example:-

<?php

$haystack
= "ASD is trying to get out of the ASDs cube but the other ASDs told him that his behavior will destroy the ASDs world";
$needle = "ASD";
print_r(strallpos($haystack,$needle));
//getting all the positions starting from a specified position
print_r(strallpos($haystack,$needle,34));

?>


teddanzig at yahoo dot com

14 years ago


routine to return -1 if there is no match for strpos

<?php

//instr function to mimic vb instr fucntion

function InStr($haystack, $needle)

{

   
$pos=strpos($haystack, $needle);

    if (
$pos !== false)

    {

        return
$pos;

    }

    else

    {

        return -
1;

    }

}

?>


Tim

14 years ago


If you would like to find all occurences of a needle inside a haystack you could use this function strposall($haystack,$needle);. It will return an array with all the strpos's.

<?php

/**

* strposall

*

* Find all occurrences of a needle in a haystack

*

* @param string $haystack

* @param string $needle

* @return array or false

*/

function strposall($haystack,$needle){
$s=0;

   
$i=0;

   
    while (

is_integer($i)){
$i = strpos($haystack,$needle,$s);

       
        if (

is_integer($i)) {

           
$aStrPos[] = $i;

           
$s = $i+strlen($needle);

        }

    }

    if (isset(
$aStrPos)) {

        return
$aStrPos;

    }

    else {

        return
false;

    }

}

?>


user at nomail dot com

16 years ago


This is a bit more useful when scanning a large string for all occurances between 'tags'.

<?php
function getStrsBetween($s,$s1,$s2=false,$offset=0) {
   
/*====================================================================
    Function to scan a string for items encapsulated within a pair of tags

    getStrsBetween(string, tag1, <tag2>, <offset>

    If no second tag is specified, then match between identical tags

    Returns an array indexed with the encapsulated text, which is in turn
    a sub-array, containing the position of each item.

    Notes:
    strpos($needle,$haystack,$offset)
    substr($string,$start,$length)

    ====================================================================*/

if( $s2 === false ) { $s2 = $s1; }
   
$result = array();
   
$L1 = strlen($s1);
   
$L2 = strlen($s2);

    if(

$L1==0 || $L2==0 ) {
        return
false;
    }

    do {

$pos1 = strpos($s,$s1,$offset);

        if(

$pos1 !== false ) {
           
$pos1 += $L1;$pos2 = strpos($s,$s2,$pos1);

            if(

$pos2 !== false ) {
               
$key_len = $pos2 - $pos1;$this_key = substr($s,$pos1,$key_len);

                if( !

array_key_exists($this_key,$result) ) {
                   
$result[$this_key] = array();
                }
$result[$this_key][] = $pos1;$offset = $pos2 + $L2;
            } else {
               
$pos1 = false;
            }
        }
    } while(
$pos1 !== false );

    return

$result;
}
?>


philip

18 years ago


Many people look for in_string which does not exist in PHP, so, here's the most efficient form of in_string() (that works in both PHP 4/5) that I can think of:

<?php

function in_string($needle, $haystack, $insensitive = false) {

    if (
$insensitive) {

        return
false !== stristr($haystack, $needle);

    } else {

        return
false !== strpos($haystack, $needle);

    }

}

?>

Lhenry

5 years ago


note that strpos( "8 june 1970"  ,  1970 ) returns FALSE..

add quotes to the needle


gjh42 – simonokewode at hotmail dot com

11 years ago


A pair of functions to replace every nth occurrence of a string with another string, starting at any position in the haystack. The first works on a string and the second works on a single-level array of strings, treating it as a single string for replacement purposes (any needles split over two array elements are ignored).

Can be used for formatting dynamically-generated HTML output without touching the original generator: e.g. add a newLine class tag to every third item in a floated list, starting with the fourth item.

<?php
/* String Replace at Intervals   by Glenn Herbert (gjh42)    2010-12-17
*/

//(basic locator by someone else - name unknown)
//strnposr() - Find the position of nth needle in haystack.

function strnposr($haystack, $needle, $occurrence, $pos = 0) {
    return (
$occurrence<2)?strpos($haystack, $needle, $pos):strnposr($haystack,$needle,$occurrence-1,strpos($haystack, $needle, $pos) + 1);
}
//gjh42
//replace every nth occurrence of $needle with $repl, starting from any position
function str_replace_int($needle, $repl, $haystack, $interval, $first=1, $pos=0) {
  if (
$pos >= strlen($haystack) or substr_count($haystack, $needle, $pos) < $first) return $haystack;
 
$firstpos = strnposr($haystack, $needle, $first, $pos);
 
$nl = strlen($needle);
 
$qty = floor(substr_count($haystack, $needle, $firstpos + 1)/$interval);
  do {
//in reverse order
   
$nextpos = strnposr($haystack, $needle, ($qty * $interval) + 1, $firstpos);
   
$qty--;
   
$haystack = substr_replace($haystack, $repl, $nextpos, $nl);
  } while (
$nextpos > $firstpos);
  return
$haystack;
}
 
//$needle = string to find
  //$repl = string to replace needle
  //$haystack = string to do replacing in
  //$interval = number of needles in loop
  //$first=1 = first occurrence of needle to replace (defaults to first)
  //$pos=0 = position in haystack string to start from (defaults to first)

//replace every nth occurrence of $needle with $repl, starting from any position, in a single-level array

function arr_replace_int($needle, $repl, $arr, $interval, $first=1, $pos=0, $glue='|+|') {
  if (!
is_array($arr))  return $arr;
  foreach(
$arr as $key=>$value){
    if (
is_array($arr[$key])) return $arr;
  }
 
$haystack = implode($glue, $arr);
 
$haystack = str_replace_int($needle, $repl, $haystack, $interval, $first, $pos);
 
$tarr = explode($glue, $haystack);
 
$i = 0;
  foreach(
$arr as $key=>$value){
   
$arr[$key] = $tarr[$i];
   
$i++;
  }
  return
$arr;
}
?>
If $arr is not an array, or a multilevel array, it is returned unchanged.


amolocaleb at gmail dot com

4 years ago


Note that strpos() is case sensitive,so when doing a case insensitive search,use stripos() instead..If the latter is not available,subject the string to strlower() first,otherwise you may end up in this situation..
<?php
//say we are matching url routes and calling access control middleware depending on the route$registered_route = '/admin' ;
//now suppose we want to call the authorization middleware before accessing the admin route
if(strpos($path->url(),$registered_route) === 0){
    
$middleware->call('Auth','login');
}
?>
and the auth middleware is as follows
<?php
class Auth{

function

login(){
   if(!
loggedIn()){
       return
redirect("path/to/login.php");
}
return
true;
}
}
//Now suppose:
$user_url = '/admin';
//this will go to the Auth middleware for checks and redirect accordingly

//But:

$user_url = '/Admin';
//this will make the strpos function return false since the 'A' in admin is upper case and user will be taken directly to admin dashboard authentication and authorization notwithstanding
?>
Simple fixes:
<?php
//use stripos() as from php 5
if(stripos($path->url(),$registered_route) === 0){
    
$middleware->call('Auth','login');
}
//for those with php 4
if(stripos(strtolower($path->url()),$registered_route) === 0){
    
$middleware->call('Auth','login');
}
//make sure the $registered_route is also lowercase.Or JUST UPGRADE to PHP 5>

ds at kala-it dot de

3 years ago


Note this code example below in PHP 7.3
<?php
$str
= "17,25";

if(

FALSE !== strpos($str, 25)){
    echo
"25 is inside of str";
} else {
    echo
"25 is NOT inside of str";
}
?>

Will output "25 is NOT inside of str" and will throw out a deprication message, that non string needles will be interpreted as strings in the future.

This just gave me some headache since the value I am checking against comes from the database as an integer.


sunmacet at gmail dot com

2 years ago


To check that a substring is present.

Confusing check if position is not false:

if ( strpos ( $haystack , $needle ) !== FALSE )

Logical check if there is position:

if ( is_int ( strpos ( $haystack , $needle ) ) )


binodluitel at hotmail dot com

9 years ago


This function will return 0 if the string that you are searching matches i.e. needle matches the haystack

{code}
echo strpos('bla', 'bla');
{code}

Output: 0


hu60 dot cn at gmail dot com

3 years ago


A more accurate imitation of the PHP function session_start().

Function my_session_start() does something similar to session_start() that has the default configure, and the session files generated by the two are binary compatible.

The code may help people increase their understanding of the principles of the PHP session.

<?php
error_reporting
(E_ALL);
ini_set('display_errors', true);
ini_set('session.save_path', __DIR__);my_session_start();

echo

'<p>session id: '.my_session_id().'</p>';

echo

'<code><pre>';
var_dump($_SESSION);
echo
'</pre></code>';$now = date('H:i:s');
if (isset(
$_SESSION['last_visit_time'])) {
  echo
'<p>Last Visit Time: '.$_SESSION['last_visit_time'].'</p>';
}
echo
'<p>Current Time: '.$now.'</p>';$_SESSION['last_visit_time'] = $now;

function

my_session_start() {
  global
$phpsessid, $sessfile;

  if (!isset(

$_COOKIE['PHPSESSID']) || empty($_COOKIE['PHPSESSID'])) {
   
$phpsessid = my_base32_encode(my_random_bytes(16));
   
setcookie('PHPSESSID', $phpsessid, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
  } else {
   
$phpsessid = substr(preg_replace('/[^a-z0-9]/', '', $_COOKIE['PHPSESSID']), 0, 26);
  }
$sessfile = ini_get('session.save_path').'/sess_'.$phpsessid;
  if (
is_file($sessfile)) {
   
$_SESSION = my_unserialize(file_get_contents($sessfile));
  } else {
   
$_SESSION = array();
  }
 
register_shutdown_function('my_session_save');
}

function

my_session_save() {
  global
$sessfile;file_put_contents($sessfile, my_serialize($_SESSION));
}

function

my_session_id() {
  global
$phpsessid;
  return
$phpsessid;
}

function

my_serialize($data) {
 
$text = '';
  foreach (
$data as $k=>$v) {
   
// key cannot contains '|'
   
if (strpos($k, '|') !== false) {
      continue;
    }
   
$text.=$k.'|'.serialize($v)."n";
  }
  return
$text;
}

function

my_unserialize($text) {
 
$data = [];
 
$text = explode("n", $text);
  foreach (
$text as $line) {
   
$pos = strpos($line, '|');
    if (
$pos === false) {
      continue;
    }
   
$data[substr($line, 0, $pos)] = unserialize(substr($line, $pos + 1));
  }
  return
$data;
}

function

my_random_bytes($length) {
  if (
function_exists('random_bytes')) {
      return
random_bytes($length);
  }
 
$randomString = '';
  for (
$i = 0; $i < $length; $i++) {
     
$randomString .= chr(rand(0, 255));
  }
  return
$randomString;
}

function

my_base32_encode($input) {
 
$BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
 
$output = '';
 
$v = 0;
 
$vbits = 0;
  for (
$i = 0, $j = strlen($input); $i < $j; $i++) {
   
$v <<= 8;
   
$v += ord($input[$i]);
   
$vbits += 8;
    while (
$vbits >= 5) {
     
$vbits -= 5;
     
$output .= $BASE32_ALPHABET[$v >> $vbits];
     
$v &= ((1 << $vbits) - 1);
    }
  }
  if (
$vbits > 0) {
   
$v <<= (5 - $vbits);
   
$output .= $BASE32_ALPHABET[$v];
  }
  return
$output;
}


msegit post pl

4 years ago


This might be useful, I often use for parsing file paths etc.
(Some examples inside https://gist.github.com/msegu/bf7160257037ec3e301e7e9c8b05b00a )
<?php
/**
* Function 'strpos_' finds the position of the first or last occurrence of a substring in a string, ignoring number of characters
*
* Function 'strpos_' is similar to 'str[r]pos()', except:
* 1. fourth (last, optional) param tells, what to return if str[r]pos()===false
* 2. third (optional) param $offset tells as of str[r]pos(), BUT if negative (<0) search starts -$offset characters counted from the end AND skips (ignore!, not as 'strpos' and 'strrpos') -$offset-1 characters from the end AND search backwards
*
* @param string $haystack Where to search
* @param string $needle What to find
* @param int $offset (optional) Number of characters to skip from the beginning (if 0, >0) or from the end (if <0) of $haystack
* @param mixed $resultIfFalse (optional) Result, if not found
*    Example:
*    positive $offset - like strpos:
*        strpos_('abcaba','ab',1)==strpos('abcaba','ab',1)==3, strpos('abcaba','ab',4)===false, strpos_('abcaba','ab',4,'Not found')==='Not found'
*    negative $offset - similar to strrpos:
*        strpos_('abcaba','ab',-1)==strpos('abcaba','ab',-1)==3, strrpos('abcaba','ab',-3)==3 BUT strpos_('abcaba','ab',-3)===0 (omits 2 characters from the end, because -2-1=-3, means search in 'abca'!)
*
* @result int $offset Returns offset (or false), or $resultIfFalse
*/
function strpos_($haystack, $needle, $offset = 0, $resultIfFalse = false) {
   
$haystack=((string)$haystack);    // (string) to avoid errors with int, float...
   
$needle=((string)$needle);
    if (
$offset>=0) {
       
$offset=strpos($haystack, $needle, $offset);
        return ((
$offset===false)? $resultIfFalse : $offset);
    } else {
       
$haystack=strrev($haystack);
       
$needle=strrev($needle);
       
$offset=strpos($haystack,$needle,-$offset-1);
        return ((
$offset===false)? $resultIfFalse : strlen($haystack)-$offset-strlen($needle));
    }
}
?>

I need to convert strings of the form

"a b c"

into arrays of the form

Array
(
    [0] => a
    [1] => a b
    [2] => a b c
    [3] => b
    [4] => b c
    [5] => c
)

Does PHP provide a native function for converting strings into all substrings? If not, what’s the path of least resistance for getting all substrings? Is there a straightforward way to perhaps explode() the string, and use an array op to generate all [ordered] permutations?

Cheers!

ninjagecko's user avatar

ninjagecko

87.9k24 gold badges137 silver badges145 bronze badges

asked Jan 20, 2010 at 7:39

Chris Tonkinson's user avatar

Chris TonkinsonChris Tonkinson

13.6k14 gold badges58 silver badges90 bronze badges

Using the in-php-array-is-the-duct-tape-of-the-universe way 😛

function get_all_substrings($input, $delim = '') {
    $arr = explode($delim, $input);
    $out = array();
    for ($i = 0; $i < count($arr); $i++) {
        for ($j = $i; $j < count($arr); $j++) {
            $out[] = implode($delim, array_slice($arr, $i, $j - $i + 1));
        }       
    }
    return $out;
}

$subs = get_all_substrings("a b c", " ");
print_r($subs);

answered Jan 20, 2010 at 9:32

Lukman's user avatar

1

<?php
function get_all_substrings($input){
    $subs = array();
    $length = strlen($input);
    for($i=0; $i<$length; $i++){
        for($j=$i; $j<$length; $j++){
            $subs[] = substr($input, $i, $j);               
        }
    }
    return $subs;
}

$subs = get_all_substrings("Hello world!");
print_r($subs);

?>

Even if there’s a fancy two-liner to accomplish this, I doubt it’s any more efficient or easy to understand (for anybody to understand it they’d probably have to look at the docs. Most folks probably get what substr does without even looking it up).

answered Jan 20, 2010 at 7:56

echo's user avatar

echoecho

7,6872 gold badges35 silver badges33 bronze badges

3

Minor correction to the second one:

<?php
function get_all_substrings($input){
$subs = array();
$length = strlen($input);
for($i=0; $i<$length; $i++){
    for($j=$i; $j<$length; $j++){
        $subs[] = substr($input, $i, ($j - $i) + 1);    
    }   
}   
return $subs;
}

$subs = get_all_substrings("abc");
print_r($subs);

?>

answered Dec 2, 2010 at 9:14

Spartan's user avatar

SpartanSpartan

5474 silver badges12 bronze badges

1

Substrings are not permutations. explode() the string, then use two nested loops along with array_slice() to get the relevant elements.

answered Jan 20, 2010 at 7:49

Ignacio Vazquez-Abrams's user avatar

All possible substrings

  <?php   
         $str1 = "ABCD";
         $len = strlen($str1);
         $arr = array();
         for($i = 0; $i < $len; $i++){  
             for($j = 0; $j < $len - $i; $j++){  
                 $arr [] = substr($str1,$i,($j+1));  
             }  
         }  

         echo(json_encode($arr));
     ?>

answered Apr 12, 2019 at 10:27

puneet jain's user avatar

They can already be thought of arrays of that form.

Simply address the contents with a function that takes the index as a parameter and returns the string sliced appropriately.

answered Jan 20, 2010 at 10:03

yosser's user avatar

yosseryosser

2521 silver badge5 bronze badges

And this question will not be complete without the recursive answer:

function get_substrings($str){
    $len = strlen($str);
    $ans = array();
    $rest = array();
    for ($i = 1; $i <= $len; $i++) {                 
        $ans[] = substr($str, 0, $i);        
    }
    if($str){
        $rest = get_substrings(substr($str, 1));
    }
    return array_merge($ans, $rest);
}

$subs = get_substrings("abc");
print_r($subs);

answered Sep 7, 2012 at 17:50

Nir Alfasi's user avatar

Nir AlfasiNir Alfasi

53k11 gold badges85 silver badges129 bronze badges

This works and it works also with multibyte strings, all the methods above don’t, they return null and duplicated values.

function substrings($str, $charset = 'UTF-8') {   
  $length = mb_strlen($str, $charset);

  $subs = [];
  for ($i = 0; $i < $length; $i++)
    for ($j = 1; $j <= $length; $j++)
      $subs[] = mb_substr($str, $i, $j, $charset);

  return array_unique($subs);
}

print_r(substrings("php"));

answered Oct 31, 2014 at 15:04

noun's user avatar

nounnoun

3,6172 gold badges25 silver badges27 bronze badges

For even quite short strings, the memory and runtime requirement will explode. Even in native code this is a scary performance problem.

Justify why you need this function, and work out another way around the problem.

answered Jan 20, 2010 at 9:34

Will's user avatar

WillWill

73.5k39 gold badges169 silver badges243 bronze badges

Оглавление

  • Строковые операторы
    • Конкатенация строк
    • Присваивание с конкатенацией
  • Подсчёт символов в строке
    • Получить длину строки
    • Количество символов без пробелов
    • Количество слов в строке
    • Количество переносов в строке
    • Количество букв в строке
    • Количество цифр в строке
    • Количество знаков препинания
    • Количество пробелов в строке
  • Поиск по строке
    • Получить количество определённых слов в строке
    • Позиция первого вхождения подстроки в строку
    • Позиция последнего вхождения подстроки в строку
    • Найти все вхождения подстроки
  • Замена в строках
  • Замена символов и слов в строке
    • Замена пробелов в строке
    • Замена до определённого символа

Не пропусти свежие посты, подпишись:

Строка (тип string) – это набор символов, где символ – это то же самое, что и байт. Это значит, что PHP поддерживает ровно 256 различных символов, а также то, что в PHP нет встроенной поддержки Unicode.

Простейший способ определить строку – это заключить её в одинарные кавычки (символ '). Чтобы использовать одинарную кавычку внутри строки, проэкранируйте её обратным слешем (). Если необходимо написать сам обратный слеш, продублируйте его (\). Все остальные случаи применения обратного слеша будут интерпретированы как обычные символы: это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как r или n, они будут выведены как есть вместо какого-либо особого поведения. 

Давайте рассмотрим частые примеры работы со строками в PHP.

Строковые операторы

Основными строковыми операторами являются конкатенация и присваивание с конкатенацией.

Конкатенация строк

Данные оператор позволяет объединить две и более строк в одну. 


$str1 = 'У лукоморья дуб зелёный;';
$str2 = 'Златая цепь на дубе том';

$str = $str1 . ' ' . $str2; //Объединяем (склеиваем) 3 строки $str1, пробел и $str2
var_dump($str);

Результат:


string(87) "У лукоморья дуб зелёный; Златая цепь на дубе том"

Присваивание с конкатенацией

Этот оператор позволяет “приклеить” строки более короткой записью. Изменим вышеуказанный пример:


$str1 = 'У лукоморья дуб зелёный;';
$str2 = 'Златая цепь на дубе том';

$str .= $str1;
$str .= ' ';
$str .= $str2;

var_dump($str);

Результат тот же самый:


string(87) "У лукоморья дуб зелёный; Златая цепь на дубе том"

Данный пример может не очень хорошо отражает удобство этого метода. Но представьте что у вас есть массив строковых значений и вам нужно проверить его элементы и при определённых условиях собрать из них строку.


$str = '';
$arr = [
	'Строка 1 ',
	'Строка 2 ',
	'Строка 3 ',
	'Строка 4 ',
	'Строка 5 '
];

foreach($arr as $item) {
	//некоторая проверка
	$str .= $item;
}

var_dump($str);


Результат:


string(75) "Строка 1 Строка 2 Строка 3 Строка 4 Строка 5 "

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

Подсчёт символов в строке

Рассмотрим функции позволяющие сосчитать символы в строке.

Получить длину строки

Для этого используется функция strlen() принимающая саму строку, возвращает целое число, количество всех символов в строке. Если в строке есть кирилические символы в кодировке UTF-8, функция вернёт не правильный результат. Чтобы получить верную длину строки для кириллицы, используйте функцию mb_strlen().


$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том';

echo strlen($str) . '<br/>';
echo mb_strlen($str) . '<br/>';

Результат:


87
48

Вообще для работы со строками в UTF-8 есть целый набор функций с префиксом mb.

Количество символов без пробелов

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


$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том';

//заменяем в строке все пробелы
$str = mb_ereg_replace('[s]', '', $str);

//Считаем поличество символов
echo mb_strlen($str); 

Количество слов в строке


$str = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit';

//Считаем количество слов в строке
$count = str_word_count($str);

var_dump($count); // вернёт 8

Функция str_word_count() не работает с кириллицей по умолчанию и не имеет “двойника” с префиксом mb_. Чтобы это исправить, нужно передать дополнительные аргументы, формат возвращаемых данных равный 2, в этом случае функция вернёт массив, а третий аргумент, строка с русским алфавитом в разном регистре.


//Не работает без доп.параметров для строк с кириллицей
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том';

//Считаем количество слов в строке, результат будет в виде массива отдельных слов
$arr = str_word_count($str, 2, 'АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя');

//Считаем количество элементов в массиве
$count =count($arr)

var_dump($count); //вернёт 9

Количество переносов в строке

Тут потребуется функция substr_count() которая считает количество вхождений подстроки, в исходную строку. В качестве подстроки будем использовать PHP_EOLPHP_EOL это константа принимающая значения корректного символа конца строки (переноса) на текущей платформе, где выполняется php скрипт.


$str = 'У лукоморья дуб зелёный;
Златая цепь на дубе том:
И днём и ночью кот учёный
Всё ходит по цепи кругом;';

echo substr_count($str, PHP_EOL); // вернёт 3

Количество букв в строке

Опять таки исходная строка требует внесения предварительных изменений.


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

//Оставляем только буквы в строке
echo $str = preg_replace('/[^a-zа-яё]/ui', '', $str); 

//Считаем количестсво букв
echo mb_strlen($str); // вернёт 39

Количество цифр в строке

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


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

//Оставляем только буквы в строке
echo $str = preg_replace('/[^0-9]/ui', '', $str); 

//Считаем количестсво букв
echo mb_strlen($str); // вернёт 0

Количество знаков препинания


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

//Оставляем только буквы в строке
echo $str = preg_replace('/[^[:punct:]]/', '', $str); 

//Считаем количестсво букв
echo mb_strlen($str); // вернёт 2

Количество пробелов в строке


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

echo substr_count($str, ' '); //Вернёт 8

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

Рассмотрим различные методы поиска в строке.

Получить количество определённых слов в строке


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

echo mb_substr_count($str, 'Златая'); // 1

Есть зависимость от регистра, т.е. вот так функция ничего не найдёт:


echo mb_substr_count($str, 'златая'); // 0

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

Тут есть функция позволяющая игнорировать регистр символов


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

//С учётом регистра
echo mb_strpos($str, 'Златая'); // 25
 
// Без учета регистра
echo mb_stripos($str, 'златая'); // 25

Позиция последнего вхождения подстроки в строку

Так же можно игнорировать регистр


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

//С учётом регистра
echo mb_strrpos($str, 'дуб'); // 40
 
// Без учета регистра:
echo mb_strrpos($str, 'дуб'); // 40

Найти все вхождения подстроки


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

$offset = 0;
$allpos = [];

while (($position = mb_strpos($str, 'дуб', $offset)) !== false) {
	$offset   = $position + 1;
	$allpos[] = $position;
}

echo '<pre>';
print_r($allpos);
echo '</pre>';

Результат:


Array
(
    [0] => 12
    [1] => 40
)

Обратите внимание на сравнение !== false, это сделано для того, чтобы учесть подстроку, если она будет в начале строки и её позиция будет равна 0. Такое сравнение позволяет исключить приведение 0 к false, что привело бы к логической ошибке.

Замена в строках

Функция substr_replace($search, $replace, $subject, $count) заменяет часть $search строки $subject на $replace. Она также не раотает с кирилицей в кодировке UTF-8, в библиатеке mb_string её нет, поэтому нам потребуется написать свой аналог:


/**
 * @param $original
 * @param $replacement
 * @param $position
 * @param $length
 * @return string
 */
function mb_substr_replace($original, $replacement, $position, $length){
    $startString = mb_substr($original, 0, $position, 'UTF-8');
    $endString = mb_substr($original, $position + $length, mb_strlen($original), 'UTF-8');
    $out = $startString . $replacement . $endString;
    return $out;
}

Замени часть строки


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

//Ищем подстроку "зелёный" и заменяем её на "красный"
var_dump(mb_substr_replace($str, 'красный', mb_strpos($str, 'зелёный'), mb_strlen('зелёный')));

Результат:


string(88) "У лукоморья дуб красный; Златая цепь на дубе том:"

Замена символов и слов в строке

В php есть функция  str_replace($search, $replace, $subject) которая будет сама осуществлять поиск вхождения, расчёт длины строки и при этом, она будет работаь со всеми кодировками.

Замена пробелов в строке



//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

echo str_replace(' ', '*', $str); // У*лукоморья*дуб*зелёный;*Златая*цепь*на*дубе*том:


Замена до определённого символа


//Исходная строка
$str = 'У лукоморья дуб зелёный; Златая цепь на дубе том:';

$str = 'Зелёный дуб у лукоморья' . mb_substr($str, mb_strpos($str, '; '), -1);

echo $str; //Зелёный дуб у лукоморья; Златая цепь на дубе том

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

Добавить комментарий