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.