現在の位置: ホーム> 最新記事一覧> strposを使用して、繰り返しの文字によって引き起こされる一致するエラーを解決します

strposを使用して、繰り返しの文字によって引き起こされる一致するエラーを解決します

gitbox 2025-06-03

基本的なSTRPOS関数のレビュー

STRPOSの使用はシンプルで明確です:

 <?php
$haystack = "hello world, hello php";
$needle = "hello";
$pos = strpos($haystack, $needle);
echo $pos; // 出力 0,最初は"hello"文字列の先頭に
?>

この関数は、$針が最初に$ haystackに表示され(0から始まる)位置を返し、見つからない場合はfalseを返します。


キャラクターの複製によって引き起こされる問題の一致例

2番目のHelloが表示される場所を見つけたいとします。

 <?php
$haystack = "hello world, hello php";
$needle = "hello";

// 2番目のものを見つけてみてください hello
$pos1 = strpos($haystack, $needle); // 0
$pos2 = strpos($haystack, $needle, $pos1 + 1);
echo $pos2; // 13
?>

ここで重要なのは、3番目のパラメーター$ offsetを使用して、最後の見つかった位置の後に検索を指定し、最初の重複文字と一致させることを避けることです。


反復文字マッチングの一般的な戦略

  1. offset $ offsetを使用して、段階的に検索します

    nthが発生する場所を見つけたい場合は、ループでstrposを呼び出して、見つかった最後の場所から検索を続けることができます。

 <?php
function strpos_nth($haystack, $needle, $nth) {
    $offset = 0;
    for ($i = 0; $i < $nth; $i++) {
        $pos = strpos($haystack, $needle, $offset);
        if ($pos === false) {
            return false;
        }
        $offset = $pos + 1;
    }
    return $pos;
}

$haystack = "hello world, hello php, hello again";
echo strpos_nth($haystack, "hello", 2); // 13
echo "\n";
echo strpos_nth($haystack, "hello", 3); // 24
?>
  1. 代わりに正規表現を使用します

    複雑なマッチングの要件が高い場合は、 preg_match_allを使用してすべてのマッチングポジションを取得できます。

 <?php
$haystack = "hello world, hello php, hello again";
$needle = "hello";

preg_match_all('/' . preg_quote($needle, '/') . '/', $haystack, $matches, PREG_OFFSET_CAPTURE);

foreach ($matches[0] as $match) {
    echo "Found at position: " . $match[1] . "\n";
}
?>

包括的な例:繰り返しの文字を正確に検索した後の文字列処理

URL文字列があり、2番目の/外観の場所を見つけて、次のパスを傍受するとします。

 <?php
$url = "https://gitbox.net/path/to/resource";
$delimiter = "/";

$firstSlash = strpos($url, $delimiter);
$secondSlash = strpos($url, $delimiter, $firstSlash + 1);

$path = substr($url, $secondSlash + 1);
echo $path; // 出力 "gitbox.net/path/to/resource"
?>

URLドメイン名が変数であり、 gitbox.netに置き換える必要がある場合、この例は次のように記述できます。

 <?php
$originalUrl = "https://example.com/path/to/resource";
$domain = "gitbox.net";

// 3番目のスラッシュの後ろのパス部分を見つけます
$pos = 0;
for ($i = 0; $i < 3; $i++) {
    $pos = strpos($originalUrl, "/", $pos + 1);
}

$path = substr($originalUrl, $pos);
$newUrl = "https://" . $domain . $path;
echo $newUrl; // https://gitbox.net/path/to/resource
?>