Dans le développement de PHP, il est courant de rencontrer des problèmes de correspondance et de manipulation des structures imbriquées (telles que les balises HTML, les structures JSON, etc.). Il n'est pas facile d'utiliser directement des expressions régulières pour correspondre aux structures imbriquées, car les expressions régulières elles-mêmes ne sont pas bonnes pour gérer les modèles récursifs et imbriqués. Mais en combinant des fonctions de rappel, nous pouvons gérer efficacement ces structures imbriquées. Cet article explorera comment utiliser des expressions et des fonctions de rappel régulières pour réaliser une correspondance de structure imbriquée efficace en PHP.
Une fonction de rappel consiste à passer une fonction en tant que paramètre à une autre fonction et à appeler la fonction en cas de besoin. En PHP, les fonctions de rappel sont souvent utilisées avec des expressions régulières. Une fois l'expression régulière appariée, le résultat correspondant est traité à l'aide de la fonction de rappel.
Les expressions régulières (regex) sont un outil pour faire correspondre les modèles dans les chaînes. PHP fournit une variété de fonctions pour soutenir l'utilisation d'expressions régulières. preg_match () , preg_replace () et preg_match_all () sont des fonctions régulières couramment utilisées.
Par exemple, supposons que nous ayons une chaîne HTML et que nous souhaitions extraire tous les liens ( l'attribut HREF de la balise <a> ). Nous pouvons utiliser l'expression régulière suivante pour correspondre:
$html = '<a href="http://m66.net/page1">Page 1</a><a href="http://m66.net/page2">Page 2</a>';
$pattern = '/<a href="([^"]+)">/';
preg_match_all($pattern, $html, $matches);
print_r($matches);
Le code ci-dessus extrait les attributs HREF de toutes les balises <a> .
Pour l'appariement de la structure imbriquée, l'expression régulière elle-même peut ne pas gérer bien. Nous pouvons améliorer la puissance de traitement des résultats de correspondance en utilisant des fonctions de rappel. Par exemple, supposons que nous ayons affaire à une structure HTML imbriquée, et nous voulons pouvoir analyser les balises dedans et gérer chaque balise spécifiquement.
Nous pouvons utiliser la fonction preg_replace_callback () , qui nous permet d'appeler une fonction de rappel lors du remplacement et de traiter le contenu correspondant dans la fonction de rappel.
$html = '<div><a href="http://m66.net/page1">Page 1</a></div><div><a href="http://m66.net/page2">Page 2</a></div>';
$pattern = '/<a href="([^"]+)">(.*?)<\/a>/';
$html = preg_replace_callback($pattern, function($matches) {
// Ici$matches[1]C'est l'adresse de lien,$matches[2]C'est le texte du lien
$url = $matches[1];
$text = $matches[2];
// Modifier le lien
$new_url = str_replace('http://m66.net', 'https://m66.net', $url);
// Retourner au modifiéHTML
return '<a href="' . $new_url . '">' . $text . '</a>';
}, $html);
echo $html;
Dans le code ci-dessus, nous utilisons la fonction preg_replace_callback () pour correspondre à la balise <a> . La fonction de rappel reçoit le résultat correspondant de l'expression régulière et modifie chaque HREF lié au besoin (par exemple, la modification du protocole URL).
Le résultat de la sortie sera:
<div><a href="https://m66.net/page1">Page 1</a></div>
<div><a href="https://m66.net/page2">Page 2</a></div>
L'utilisation d'expressions régulières devient plus délicate lorsqu'il s'agit de gérer des structures imbriquées plus complexes. À ce stade, nous pouvons gérer les hiérarchies imbriquées en appelant la fonction de rappel récursivement. Par exemple, supposons que nous ayons une structure HTML imbriquée qui doit être traitée sur chaque balise <a> .
$html = '<div><a href="http://m66.net/page1"><div><a href="http://m66.net/page2">Page 2</a></div>Page 1</a></div>';
$pattern = '/<a href="([^"]+)">(.*?)<\/a>/';
$html = preg_replace_callback($pattern, function($matches) {
// Ici$matches[1]C'est l'adresse de lien,$matches[2]C'est le texte du lien
$url = $matches[1];
$text = $matches[2];
// Modifier le lien
$new_url = str_replace('http://m66.net', 'https://m66.net', $url);
// Retourner au modifiéHTML
return '<a href="' . $new_url . '">' . $text . '</a>';
}, $html);
echo $html;
Dans cet exemple, même si la balise <a> est imbriquée dans la balise <div> , nous pouvons toujours gérer chaque lien correctement et modifier l'attribut HREF .
En combinant des expressions et des fonctions de rappel régulières, nous pouvons gérer efficacement les structures imbriquées en PHP. Les expressions régulières conviennent aux modèles de capture, tandis que les fonctions de rappel nous permettent d'effectuer des opérations supplémentaires sur les résultats correspondants. Bien que les expressions régulières elles-mêmes ne soient pas bonnes à manipuler des structures récursives et imbriquées, l'application flexible des fonctions de rappel peut atteindre un traitement précis des structures complexes.