Inserimento dopo la sezione head
Abbiamo una stringa e un documento HTML.
Scrivete un’espressione regolare che inserisca <h1>Hello</h1>
subito dopo il tag <body>
. Il tag può avere degli attributi.
Per esempio:
let regexp = /your regular expression/;
let str = `
<html>
<body style="height: 200px">
...
</body>
</html>
`;
str = str.replace(regexp, `<h1>Hello</h1>`);
Dopo l’inserimento il valore di str
dovrebbe essere:
<html>
<body style="height: 200px"><h1>Hello</h1>
...
</body>
</html>
Per inserire qualcosa dopo il tag <body>
dobbiamo prima trovarlo. A questo scopo possiamo usare l’espressione regolare <body.*?>
.
In questa esercitazione non abbiamo bisogno di modificare il tag <body>
. Dobbiamo solo aggiungere del testo dopo di esso.
Ecco come possiamo farlo:
let str = '...<body style="...">...';
str = str.replace(/<body.*?>/, '$&<h1>Hello</h1>');
alert(str); // ...<body style="..."><h1>Hello</h1>...
Nella stringa di sostituzione $&
identifica la stessa corrispondenza, in altre parole, la parte della stringa sorgente che trova riscontro con <body.*?>
. Essa viene sostituita da se stessa più l’aggiunta di <h1>Hello</h1>
.
L’uso del lookbehind costituisce un’alternativa:
let str = '...<body style="...">...';
str = str.replace(/(?<=<body.*?>)/, `<h1>Hello</h1>`);
alert(str); // ...<body style="..."><h1>Hello</h1>...
Come potete osservare, c’è solo la parte di lookbehind in questa regexp.
Funziona in questo modo:
- Per ogni posizione nella stringa.
- Verifica se è preceduta da
<body.*?>
. - In caso affermativo abbiamo trovato la corrispondenza.
Il tag <body.*?>
non verrà restituito. Il risultato di questa regexp è letteralmente una stringa vuota, ma individua le posizioni precedute da <body.*?>
.
Quindi sostituisce uno “spazio vuoto” preceduto da <body.*?>
, con <h1>Hello</h1>
. In altre parole effettua un inserimento dopo <body>
.
P.S. I flag s
e i
potrebbero inoltre risultare utili: /<body.*?>/si
. Il flag s
fa in modo che il .
identifichi anche un carattere di nuova riga, e con il flag i
otteniamo che <body>
e <BODY>
costituiscano entrambi un riscontro.