Position actuelle: Accueil> Derniers articles> Évitez les $ inutiles qui correspondent au contenu avec le groupement non captureux

Évitez les $ inutiles qui correspondent au contenu avec le groupement non captureux

M66 2025-06-02

Dans PHP, la fonction preg_replace_callback_array est généralement utilisée pour effectuer des opérations de rappel lors de l'exécution de remplacement régulier. Cette fonction accepte un tableau dont les clés sont des expressions régulières et les valeurs sont des fonctions de rappel qui gèrent la correspondance. Cependant, dans certains cas, nous ne souhaitons peut-être pas capturer certains groupes pour les empêcher d'apparaître dans $ correspondants , ce qui entraîne des frais généraux inutiles ou un traitement complexe.

Utilisation de paquets non capturés

Pour éviter de recevoir un contenu inutile $ correspond à la fonction de rappel de preg_replace_callback_array , nous pouvons utiliser le regroupement sans capture . Le regroupement non capturant garantit que certains groupes ne sont pas capturés lorsqu'ils sont appariés, réduisant ainsi les résultats de correspondance inutiles dans la fonction de rappel.

Qu'est-ce que le regroupement non capturant?

Le regroupement non capturant est déclaré en préfixant les parenthèses dans des expressions régulières avec ?: . Par exemple, (?: ...) est un groupe non capturant. Dans ce cas, les groupes dans les expressions régulières ne sont pas capturés dans le tableau $ Matches , mais ne sont que des composants utilisés pour regrouper les modèles de correspondance.

Exemple de code

Supposons que nous ayons une expression régulière avec plusieurs groupes à l'intérieur, mais nous ne nous soucions que du contenu correspondant de certains groupes, et non du contenu d'autres. Ensuite, nous pouvons utiliser un regroupement non capturant pour optimiser nos expressions régulières.

 <?php
// Exemple:Remplacer le texte dansURL
$pattern = '/(?:https?:\/\/)(m66.net\/[a-z0-9\/\?=&]*)/i';
$replacement = function ($matches) {
    // Se soucier justeURLLa partie de chemin de,Pas besoin de l&#39;ensembleURLet section d&#39;accords
    return 'https://m66.net' . $matches[1];
};

$input = 'Veuillez visiter https://m66.net/abc/def?query=xyz ou http://m66.net/12345';
$output = preg_replace_callback_array([
    $pattern => $replacement,
], $input);

echo $output;
?>

Analyse de code

  1. Expression régulière :

    • (?: Https ?: \ / \ /) : Cette partie est un regroupement non capturant, qui correspond à la partie protocole de l'URL (HTTP ou HTTPS). Comme nous n'avons pas besoin de cette partie, nous utilisons le groupe non capture.

    • (m66.net \ / [a-z0-9 \ / \? = &] *) : C'est le groupe de capture, et ce qui nous intéresse est la partie de chemin derrière m66.net (tel que / abc / def? Query = xyz ).

  2. Fonction de rappel :

    • Dans la fonction de rappel, nous obtenons la partie de chemin de l'URL via $ correspond [1] , ignorant la pièce de protocole ( https: // ou http: // ).

    • Étant donné que la pièce de protocole n'est pas capturée, preg_replace_callback_array ne fournira que $ correspondant [1] en tant que valeur de remplacement à la fonction de rappel.

  3. Résultat de sortie :

    • Les URL du texte d'origine sont correctement remplacées par le format qui nous intéresse, et il n'y a pas de contenu $ inutile.

Résumer

L'utilisation de regroupement non capturant (?: ...) peut nous aider à éviter de recevoir des groupes de correspondance inutiles dans la fonction de rappel. Cela réduit non seulement la consommation de ressources inutile, mais rend également le code plus concis et plus facile à comprendre, en particulier lorsqu'il s'agit d'expressions régulières complexes, elle peut effectivement réduire les résultats correspondants qui nécessitent une attention.