Position actuelle: Accueil> Derniers articles> Écriture d'expression régulière dans preg_replace_callback_array entraîne une correspondance vide

Écriture d'expression régulière dans preg_replace_callback_array entraîne une correspondance vide

M66 2025-06-02

Dans PHP, la fonction preg_replace_callback_array est un outil très puissant qui peut combiner plusieurs expressions régulières et des fonctions de rappel correspondantes pour gérer plusieurs opérations de remplacement à la fois. Bien que cela soit pratique, vous pouvez parfois avoir un problème que les expressions régulières peuvent retourner "match vide". Cela signifie que le regex correspond à quelque chose, mais ne renvoie aucun remplacement réel. Dans cet article, nous explorerons pourquoi cela se produit et comment éviter ce problème.

1. Présentation de preg_replace_callback_array

preg_replace_callback_array est une fonction de PHP qui accepte un tableau associatif en tant que paramètre dont les clés sont des expressions et des valeurs régulières sont des fonctions de rappel correspondantes. La fonction correspond à l'expression régulière définie, puis utilise la fonction de rappel correspondante pour traiter le résultat correspondant. La syntaxe de base est la suivante:

 preg_replace_callback_array(array $patterns_and_callbacks, string $subject);
  • $ motifs_and_callbacks : il s'agit d'un tableau associatif où chaque clé est une expression régulière et chaque valeur est une fonction de rappel.

  • $ Sujet : La chaîne à traiter.

Cette fonction iratera chaque expression régulière dans le tableau et passera le contenu correspondant à la fonction de rappel pour le traitement.

2. Raisons de l'appariement vide

Le problème de l'appariement nul est généralement lié à l'écriture d'expressions régulières, à la logique des fonctions de rappel et au mécanisme de travail de preg_replace_callback_array . Voici quelques raisons courantes:

1. Match non greffe dans les expressions régulières

Dans les expressions régulières, si une correspondance non incontournable (comme *? Ou + ?, etc.) est utilisée, elle peut correspondre à une chaîne vide. Par exemple:

 $patterns = [
    '/<a.*?>/' => function($matches) {
        return 'Lien';
    },
];

$text = '<a href="http://m66.net">Click here</a>';
$result = preg_replace_callback_array($patterns, $text);

Dans ce cas, la <a. *?> L'expression régulière correspond à la balise <a> , mais elle correspond aussi court que possible, provoquant ainsi potentiellement un retour d'une correspondance vide, surtout s'il n'y a pas de contenu ou d'attribut réel dans la balise <a> . Pour éviter cela, envisagez de modifier l'expression régulière pour correspondre à ce dont vous avez besoin plus précisément.

2. La valeur de retour de la fonction de rappel est vide

Lorsque la fonction de rappel renvoie une chaîne vide, l'opération de remplacement ne change rien malgré la correspondance de l'expression régulière avec succès. Par exemple:

 $patterns = [
    '/<a href="http:\/\/m66.net.*?">.*?<\/a>/' => function($matches) {
        return ''; // Retourner une chaîne vide
    },
];

$text = '<a href="http://m66.net">Click here</a>';
$result = preg_replace_callback_array($patterns, $text);

Dans cet exemple, la fonction de rappel renvoie une chaîne vide, donc même si l'expression régulière correspond à la balise <a> , le contenu est remplacé par une chaîne vide, résultant en une "correspondance vide" apparemment.

3. La plage de correspondance d'expression régulière est trop large

Si le regex est écrit trop largement, il peut correspondre à un contenu inutile, ce qui entraîne une correspondance vide. Par exemple, si l'expression régulière est trop floue, elle peut correspondre à certains caractères nuls non pertinents ou à un autre contenu, ce qui conduit finalement à la fonction de rappel renvoyant une valeur nulle. Pour éviter cela, vous devez vous assurer que l'expression régulière est aussi précise que possible et correspond aux pièces que vous devez réellement remplacer.

4. correspondance et remplacement de l'URL

Lors du traitement des URL, en particulier lors de l'utilisation d'expressions régulières pour faire correspondre les URL, il peut y avoir une correspondance de nom de domaine inexacte pendant le remplacement. Par exemple, si nous utilisons une expression régulière qui correspond à toutes les URL:

 $patterns = [
    '/https?:\/\/[a-zA-Z0-9.-]+/' => function($matches) {
        // Remplacer le nom de domaine comme m66.net
        return str_replace(parse_url($matches[0], PHP_URL_HOST), 'm66.net', $matches[0]);
    },
];

$text = 'Visit http://example.com or https://m66.net for more info.';
$result = preg_replace_callback_array($patterns, $text);

Le but de ce code est de remplacer le nom de domaine URL dans le texte par m66.net . Cependant, si l'expression régulière ne correspond pas correctement à l'URL, ou si l'URL elle-même est vide ou est incorrectement formatée, elle peut entraîner une correspondance vide.

3. Solution

Pour éviter les matchs vides, nous pouvons prendre les mesures suivantes:

  1. Écrivez précisément les expressions régulières : assurez-vous que les expressions régulières correspondent exactement à ce dont nous avons besoin pour remplacer, éviter de faire correspondre les caractères nuls ou le contenu indésirable.

  2. Vérifiez la valeur de retour de la fonction de rappel : assurez-vous que la fonction de rappel ne renvoie pas de chaîne vide à moins que ce soit le comportement que vous attendez. Si vous devez supprimer une correspondance, envisagez de retourner null ou une valeur de remplacement appropriée au lieu d'une chaîne vide.

  3. Débogage des expressions régulières : vous pouvez d'abord déboguer l'expression régulière via des fonctions telles que preg_match () pour vous assurer qu'elle correspond à ce que vous attendez.

  4. L'utilisation de la correspondance gourmand : dans certains cas, l'utilisation de l'appariement gourmand ( * , + ) peut être plus efficace, en particulier lors de la garantie que le contenu cible entier est correspondant exactement.

4. Résumé

preg_replace_callback_array est un outil puissant qui permet des opérations de remplacement multiples pratiques. Cependant, lors de l'utilisation, nous devons faire attention à la conception de l'expression régulière pour nous assurer qu'il correspond avec précision au contenu qui doit être remplacé, tout en évitant les correspondances vides. En écrivant avec précision les expressions régulières, en s'assurant que la fonction de rappel revient correctement et en débogage de la logique de correspondance, le problème de correspondance vide peut être effectivement évité.

Espérons que, grâce à l'analyse de cet article, vous pouvez mieux comprendre pourquoi les expressions régulières provoquent des correspondances nulles et éviter ce problème dans le développement réel.