Я думаю, что вы на самом деле хотите положительный взгляд вперед. Это действительно неплохо:
/^([^<]+)(?=<p)/
Вы просто хотите убедиться, что все, что идет после <
, равно p
, но вы на самом деле не хотите потреблять <p
, поэтому вы используете опережающее внимание.
Примеры:
> var re = /^([^<]+)(?=<p)/g;
> 'foo<p>bar</p>'.replace(re, '<p>$1</p>');
"<p>foo</p><p>bar</p>"
> 'foo <b>bold</b><p>bar</p>'.replace(re, '<p>$1</p>')
"foo <b>bold</b><p>bar</p>"
Извините, в моей первоначальной публикации было недостаточно ясно: я ожидал, что бит "foo bold" также будет заключен в новый тег p
, но этого не происходит.
Кроме того, время от времени есть ввод без тегов p
(просто foo
), и он также должен отображаться на <p>foo</p>
.
Самый простой способ, который я нашел, чтобы получить эту работу, это использовать 2 отдельных регулярных выражения, /^(.+?(?=<p))/
и /^([^<]+)/
.
> var re1 = /^(.+?(?=<p))/g,
re2 = /^([^<]+)/g,
s = '<p>$1</p>';
> 'foo<p>bar</p>'.replace(re1, s).replace(re2, s);
"<p>foo</p><p>bar</p>"
> 'foo'.replace(re1, s).replace(re2, s);
"<p>foo</p>"
> 'foo <b>bold</b><p>bar</p>'.replace(re1, s).replace(re2, s);
"<p>foo <b>bold</b></p><p>bar</p>"
Можно написать одно эквивалентное регулярное выражение, комбинируя re1
и re2
:
/^(.+?(?=<p)|[^<]+)/
> var re3 = /^(.+?(?=<p)|[^<]+)/g,
s = '<p>$1</p>';
> 'foo<p>bar</p>'.replace(re3, s)
"<p>foo</p><p>bar</p>"
> 'foo'.replace(re3, s)
"<p>foo</p>"
> 'foo <b>bold</b><p>bar</p>'.replace(re3, s)
"<p>foo <b>bold</b></p><p>bar</p>"