See regex in use here
(?=\n\s*\n|\z)
(?=\n\s*\n|\z)
Positive lookahead ensuring one of the following options matches
\n\s*\n
Matches line-feed, any number of whitespace characters, and another line-feed. The reason \n{2}
or \n\n
isn't used is because sometimes people accidentally add other whitespace characters like spaces and so the regex doesn't catch those locations since it's not two \n
back-to-back.
\z
Assert position at the end of the string. This matches the end of the last paragraph.
Substitution: {{id}}
See code in use here
<?php
$re = '/(?=\n\s*\n|\z)/';
$str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste mollitia similique, blanditiis quisquam suscipit optio quam culpa odit ad magni sunt officiis, recusandae deleniti alias, natus commodi sed expedita labore.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae distinctio atque, eos quo. Autem commodi dicta, numquam natus illum recusandae quos! Veniam nulla et temporibus necessitatibus vero recusandae tempora saepe!';
$subst = '{{id}}';
echo preg_replace($re, $subst, $str);
Result:
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Iste
mollitia similique, blanditiis quisquam suscipit optio quam culpa odit
ad magni sunt officiis, recusandae deleniti alias, natus commodi sed
expedita labore.{{id}}
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae
distinctio atque, eos quo. Autem commodi dicta, numquam natus illum
recusandae quos! Veniam nulla et temporibus necessitatibus vero
recusandae tempora saepe!{{id}}