retour au cours

Insérer après Body

Nous avons une chaîne avec un document HTML.

Écrivez une expression régulière qui insère <h1>Hello</h1> immédiatement après la balise <body>. La balise peut avoir des attributs.

Par exemple:

let regexp = /your regular expression/;

let str = `
<html>
  <body style="height: 200px">
  ...
  </body>
</html>
`;

str = str.replace(regexp, `<h1>Hello</h1>`);

Après cela, la valeur de str devrait être :

<html>
  <body style="height: 200px"><h1>Hello</h1>
  ...
  </body>
</html>

Pour insérer après la balise <body>, nous devons d’abord la trouver. Nous pouvons utiliser le modèle d’expression régulière <body.*?> pour cela.

Dans cette tâche, nous n’avons pas besoin de modifier la balise <body>. Nous n’avons qu’à ajouter le texte après.

Voici comment nous pouvons le faire :

let str = '...<body style="...">...';
str = str.replace(/<body.*?>/, '$&<h1>Hello</h1>');

alert(str); // ...<body style="..."><h1>Hello</h1>...

Dans la chaîne de remplacement, $& signifie la correspondance elle-même, c’est-à-dire la partie du texte source qui correspond à <body.*?>. Il est remplacé par lui-même suivi de <h1>Hello</h1>.

Une alternative consiste à utiliser lookbehind :

let str = '...<body style="...">...';
str = str.replace(/(?<=<body.*?>)/, `<h1>Hello</h1>`);

alert(str); // ...<body style="..."><h1>Hello</h1>...

Comme vous pouvez le voir, il n’y a qu’une partie lookbehind dans cette expression régulière.

Cela fonctionne comme ceci :

  • À chaque position dans le texte.
  • Vérifiez s’il est précédé de <body.*?>.
  • Si c’est le cas, nous avons le match.

La balise <body.*?> ne sera pas renvoyée. Le résultat de cette expression régulière est littéralement une chaîne vide, mais elle ne correspond qu’aux positions précédées de <body.*?>.

Il remplace donc la “ligne vide”, précédée de <body.*?>, par <h1>Hello</h1>. C’est l’insertion après <body>.

PS Les drapeaux d’expression régulière, tels que s et i peuvent également être utiles : /<body.*?>/si. Le drapeau s fait correspondre le point . à un caractère de retour à la ligne, et le drapeau i fait que <body> correspond également à <BODY> insensible à la casse.