PHPバージョン
4.0.6+
$str = 'はじめまして。ようこそ!';
$substring = 'ようこそ';

$pos = mb_strpos($str, $substring, 0, 'UTF-8');

if ($pos !== false) {
    echo "見つかった位置: $pos";
} else {
    echo '見つかりませんでした。';
}

// 出力: 見つかった位置: 7

/*
 * 注意してください!
 * 文字列のインデックスは0から始まります。
 * 最初の文字のインデックスは0、2番目の文字のインデックスは1です。
 */
$str = 'はじめまして。ようこそ!';
$substring = 'ようこそ';

$pos = strpos($str, $substring);

if ($pos !== false) {
    echo "見つかった位置: $pos";
} else {
    echo '見つかりませんでした。';
}

// 出力: 見つかった位置: 21 ← 意図しない結果が発生します。
mb_strpos(
    string $haystack,
    string $needle,
    int $offset = 0,
    ?string $encoding = null
): int|false
$str = 'Hello, World!';
$substring = 'world';

$pos = mb_strpos($str, $substring, 0, 'UTF-8');

if ($pos === false) {
    echo "大文字と小文字が一致しないため、'world!'を見つけることができません。";
} else {
    echo "文字列に'world!'が含まれています。";
}

// 出力: "大文字と小文字が一致しないため、'world!'を見つけることができません。"
$newstring = 'あいうえお かきくけこ';
$pos = mb_strpos($newstring, 'あ', 0, 'UTF-8');

var_dump($pos); // int(0)
$str = 'Hello, World!';
$substring = '';

$pos = mb_strpos($str, $substring, 0, 'UTF-8'); // Warning: mb_strpos(): Empty needle in
$str = 'Hello, World!';
$substring = 'Hello';

$pos = mb_strpos($str, $substring, 0, 'UTF-8');

var_dump($pos); // int(0)

if ($pos === false) {
    echo "文字列に'Hello'を見つけることができません。";
} else {
    echo "文字列に'Hello'が含まれています。";
}

// 出力: "文字列に'Hello'が含まれています。"