Insertar después de la cabecera
Tenemos un string con un documento HTML.
Escribe una expresión regular que inserte <h1>Hello</h1> inmediatamente después de la etiqueta <body>. La etiqueta puede tener atributos.
Por ejemplo:
let regexp = /tu expresión regular/;
let str = `
<html>
<body style="height: 200px">
...
</body>
</html>
`;
str = str.replace(regexp, `<h1>Hello</h1>`);
Después de esto el valor de str debe ser:
<html>
<body style="height: 200px"><h1>Hello</h1>
...
</body>
</html>
Para insertar algo después de la etiqueta <body>, primero debemos encontrarla. Para ello podemos usar la expresión regular <body.*?>.
En esta tarea no necesitamos modificar la etiqueta <body>. Solamente agregar texto después de ella.
Veamos cómo podemos hacerlo:
let str = '...<body style="...">...';
str = str.replace(/<body.*?>/, '$&<h1>Hello</h1>');
alert(str); // ...<body style="..."><h1>Hello</h1>...
En el string de reemplazo, $& significa la coincidencia misma, la parte del texto original que corresponde a <body.*?>. Es reemplazada por sí misma más <h1>Hello</h1>.
Una alternativa es el uso de “lookbehind”:
let str = '...<body style="...">...';
str = str.replace(/(?<=<body.*?>)/, `<h1>Hello</h1>`);
alert(str); // ...<body style="..."><h1>Hello</h1>...
Como puedes ver, solo está presente la parte “lookbehind” en esta expresión regular.
Esto funciona así:
- En cada posición en el texto:
- Verifica si está precedida por
<body.*?>. - Si es así, tenemos una coincidencia.
La etiqueta <body.*?> no será devuelta. El resultado de esta expresión regular es un string vacío, pero coincide solo en las posiciones precedidas por <body.*?>.
Entonces reemplaza la “linea vacía”, precedida por <body.*?>, con <h1>Hello</h1>. Esto es, la inserción después de <body>.
P.S. Los indicadores de Regexp tales como s y i también nos pueden ser útiles: /<body.*?>/si. El indicador s hace que que el punto . coincida también con el carácter de salto de línea, y el indicador i hace que <body> también acepte coincidencias <BODY> en mayúsculas y minúsculas.