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