返回课程

在头部后插入

我们有一个包含 HTML 文档的字符串。

编写一个正则表达式,它在<body>标签后立即插入<h1>Hello</h1>。该标签可能具有属性。

例如

let regexp = /your regular expression/;

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.*?> 前置的位置。

因此,它用 `<h1>Hello</h1>` 替换了被 `<body.*?> 前置的“空行”。这就是在 `<body>` 之后插入的方式。

附注:正则表达式标志,例如 `s 和 `i 也很有用:`/<body.*?>/si。`s 标志使点 `. 匹配换行符,`i 标志使 `<body> 也匹配 `<BODY>,不区分大小写。