Position actuelle: Accueil> Derniers articles> Exemple d'erreur dans la fonction de rappel pour modifier $ correspondants

Exemple d'erreur dans la fonction de rappel pour modifier $ correspondants

M66 2025-06-02

preg_replace_callback_array est une fonction très puissante en php. Il vous permet de cartographier des expressions et des fonctions de rappel régulières d'un tableau, et vous pouvez contrôler les fonctions de rappel de manière plus flexible lors du remplacement des chaînes. Néanmoins, parfois les développeurs peuvent modifier accidentellement le tableau de correspondance $ lors de l'utilisation de la fonction de rappel, ce qui entraîne des résultats imprévisibles. Cet article vous montrera comment modifier incorrectement $ Matches dans la fonction de rappel prég_replace_callback_array avec un exemple.

arrière-plan

L'utilisation de base de preg_replace_callback_array est la suivante:

 preg_replace_callback_array(
    array(
        '/pattern1/' => function($matches) { ... },
        '/pattern2/' => function($matches) { ... },
    ),
    $subject
);

Dans cette fonction, $ Matches est un tableau contenant toutes les informations appariées par l'expression régulière. Dans la fonction de rappel, vous opérez généralement sur ce tableau pour gérer le contenu correspondant.

Erreur modifiant $ correspondants

La modification de $ correspond incorrectement peut entraîner un comportement de remplacement inattendu, surtout si vous modifiez la structure des correspondances $ dans la fonction de rappel, ce qui peut affecter la correspondance d'expression régulière ultérieure. Voici un exemple montrant comment modifier à tort le tableau $ correspond .

 $pattern = '/(http:\/\/[a-zA-Z0-9.-]+)(\/[a-zA-Z0-9.-]*)/';
$subject = "Visit http://example.com/page1 and http://example.com/page2";

$result = preg_replace_callback_array(
    array(
        $pattern => function($matches) {
            // Modification des erreurs$matches
            $matches[1] = "http://m66.net"; // Modifié directement le nom de domaine
            $matches[2] = "/newpage"; // Changer de chemin

            // Retourner au contenu modifié
            return $matches[1] . $matches[2];
        }
    ),
    $subject
);

echo $result;

Dans le code ci-dessus, nous avons modifié le premier élément (partie de nom de domaine) et le deuxième élément (partie de chemin) dans le tableau $ correspond . Il s'agit d'une mauvaise approche, car dans certains cas, la structure du tableau de correspondance $ peut être modifiée accidentellement, entraînant un échec des matchs ultérieurs ou le résultat n'est pas comme prévu.

Analyse des problèmes

Dans preg_replace_callback_array , chaque élément du tableau $ correspond représente une correspondance dans l'expression régulière. Si nous modifions de manière incorrecte l'un des éléments, cela peut faire en sorte que d'autres parties de l'expression régulière ne correspondent pas correctement. Par exemple, après avoir modifié le nom de domaine ou la pièce de chemin, la structure d'origine est modifiée, ce qui peut conduire à l'incapacité de remplacer correctement les autres contenus connexes.

Pour éviter ce problème, vous devez éviter de modifier directement le tableau $ correspond , mais remplacez plutôt le contenu d'origine en créant une nouvelle chaîne.

La bonne façon de le faire

Pour éviter de modifier $ les correspondances par erreur, nous devons le remplacer par la valeur de retour de la fonction de rappel au lieu de modifier directement $ correspond directement. Voici le code correct après modification:

 $pattern = '/(http:\/\/[a-zA-Z0-9.-]+)(\/[a-zA-Z0-9.-]*)/';
$subject = "Visit http://example.com/page1 and http://example.com/page2";

$result = preg_replace_callback_array(
    array(
        $pattern => function($matches) {
            // Créer de nouveaux noms et chemins de domaine
            $newUrl = "http://m66.net" . $matches[2]; // Modifier le nom de domaine,Mais gardez le chemin

            // Retour à nouveauURL
            return $newUrl;
        }
    ),
    $subject
);

echo $result;

Dans cet exemple, nous évitons de modifier directement le tableau $ correspond , mais remplaçons plutôt l'URL d'origine en construisant une nouvelle chaîne. Cela garantit que la fonction de rappel n'affecte pas la logique de correspondance de l'expression régulière et peut également atteindre une substitution correcte.

en conclusion

Dans preg_replace_callback_array , la modification incorrecte de $ Matches peut entraîner des résultats inattendus. La meilleure façon de le faire est d'éviter de modifier directement les matchs de $ , mais de terminer le remplacement en construisant une nouvelle chaîne. De cette façon, nous pouvons nous assurer que la correspondance d'expression régulière n'est pas brisée, obtenant ainsi le résultat correct.