Position actuelle: Accueil> Derniers articles> Utilisez STRPOS pour résoudre les erreurs de correspondance causées par des caractères répétés

Utilisez STRPOS pour résoudre les erreurs de correspondance causées par des caractères répétés

gitbox 2025-06-03

Examen de la fonction STRPOS de base

L'utilisation de STRPOS est simple et claire:

 <?php
$haystack = "hello world, hello php";
$needle = "hello";
$pos = strpos($haystack, $needle);
echo $pos; // Sortir 0,Parce que le premier"hello"Au début de la chaîne
?>

Cette fonction renvoie la position où $ aigule apparaît d'abord dans $ haystack (à partir de 0) et renvoie false s'il n'est pas trouvé.


Exemple de problèmes d'appariement causés par la duplication des caractères

Supposons que vous souhaitiez trouver l'emplacement où le deuxième bonjour apparaît:

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

// Essayez d&#39;en trouver un deuxième hello
$pos1 = strpos($haystack, $needle); // 0
$pos2 = strpos($haystack, $needle, $pos1 + 1);
echo $pos2; // 13
?>

La clé ici est d'utiliser le troisième paramètre $ décalage pour spécifier la recherche après la dernière position trouvée, évitant ainsi de faire correspondre le premier caractère en double.


Stratégies courantes pour l'appariement répétitif des personnages

  1. Utilisez Offset $ offset pour rechercher étape par étape

    Si vous souhaitez trouver l'emplacement où le nième se produit, vous pouvez appeler STRPOS dans une boucle et continuer à rechercher dans le dernier emplacement trouvé:

 <?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. Utilisez des expressions régulières à la place

    Si vous avez des exigences plus élevées pour une correspondance complexe, vous pouvez utiliser preg_match_all pour obtenir toutes les positions de correspondance:

 <?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";
}
?>

Exemple complet: traitement des chaînes après avoir localisé avec précision les caractères répétés

Supposons que vous ayez une chaîne d'URL, que vous souhaitiez localiser le deuxième / emplacement d'apparence et intercepter le chemin suivant:

 <?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; // Sortir "gitbox.net/path/to/resource"
?>

Si le nom de domaine URL est une variable et doit être remplacé par gitbox.net , l'exemple peut être écrit comme ceci:

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

// Trouvez la partie du chemin derrière la troisième barre de barre
$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
?>