回到课程

在标签头后插入

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

编写一个正则表达式,在 <body> 标签之后立即插入 <h1>Hello</h1>。标签可能具有特性(attribute)。

例如:

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. 正则表达式中的修饰符,例如 si 也很有用:/<body.*?>/si。这里修饰符 s 使得 . 可以匹配换行符,而修饰符 i 使 <body> 大小写不敏感,可以匹配 <BODY>