вернуться к уроку

Вставьте после фрагмента

У нас есть строка с HTML-документом.

Напишите регулярное выражение которое вставляет <h1>Hello</h1> сразу же после тега <body>. У тега могут быть атрибуты.

Например:

let regexp = /ваше регулярное выражение/;

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

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

После этого значение str:

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

Для того, чтобы вставить после тега <body>, нужно вначале его найти. Мы можем использовать регулярное выражение <body.*?> для этого.

В этом задании нам не нужно изменять <body> тег. Нам нужно только добавить текст после него.

Вот как мы можем это сделать:

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

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

В строке замены $& означает само совпадение, то есть мы заменяем ту часть текста которая соответствует <body.*?>. Совпадение заменяется на самого себя плюс <h1>Hello</h1>.

Альтернативный вариант – использовать ретроспективную проверку:

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

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

Как вы можете видеть, в этом регулярном выражении есть только ретроспективная часть.

Это работает вот так:

  • В каждой позиции текста.
  • Проверяет не предшествует ли ему <body.*?>.
  • Если это так, то мы встретили совпадение.

Тег <body.*?> не вернётся. Результатом этого регулярного выражения является буквально пустая строка, но она совпадает только в позициях, которым предшествует <body.*?>.

Происходит замена «пустой строки», которой предшествует <body.*?> на <h1>Hello</h1>. Что, как раз, и есть вставка этой строки после <body>.

P.S. Флаги регулярных выражений, такие как s и i, также могут быть полезны: /<body.*?>/si. Флаг s создает точечный . соответствует символу новой строки, а флаг i делает <body> также соответствующим <BODY> без учета регистра.