Если нет вложенных абзацев ...
my $to_insert = get_thing_to_insert();
$text =~ s/((?:<p>.*?</p>|\n\n){2})/$1$to_insert/s;
должен вот-вот сделать.
С расширенным форматированием:
$text =~ s{
( # a group
(?: # containing ...
<p> # the start of a paragraph
.*? # to...
</p> # its closing tag
| # OR...
\n\n # two newlines alone.
){2} # twice
) # and take all of that...
}
{$1$to_insert}xms # and append $val to it
Обратите внимание, я использовал \ n \ n в качестве разделителя; если вы используете текстовый файл в стиле Windows, это должно быть \r\n\r\n
, или, если оно может быть смешанным, что-то вроде \r?\n\r?\n
, чтобы сделать \r
необязательным.
Также обратите внимание, что, поскольку '\ n \ n' находится после |
, блоки <p>
могут содержать двойные символы новой строки - приоритет от <p>
до </p>
Если вы хотите, чтобы новые строки внутри <p>
имели приоритет, меняйте их местами.