将多个新行转换为段落


Convert multiple new lines to paragraphs

我想从字符串中查找段落,并格式化它们,我有什么样的作品,但它不是 100%。

所以,我有这个字符串,看起来像这样:

##Chapter 1
Once upon a time there was a little girl named sally, she went to school.
One day it was awesome!
##Chapter 2
We all had a parade!

我正在通过将##...转换为<H2>来格式化字符串,现在看起来像这样:

<h2>Chapter 1</h2>
Once upon a time there was a little girl named sally, she went to school.
One day it was awesome!
<h2>Chapter 2</h2>
We all had a parade!

现在我想将所有内容转换为一个段落,为此我这样做:

// Converts sections to paragraphs:
$this->string = preg_replace("/(^|'n'n)(.+?)('n'n|$)/", "<p>$2</p>", $this->string);
// To Remove paragraph tags from header tags (h1,h2,h3,h4,h5,h6,h7):
$this->string = preg_replace("/<p><h('d)>(.+?)<'/h'd><'/p>/i", "<h$1>$2</h$1>", $this->string);

这是最终输出(为提高可读性而添加了新行):

<h2>Chapter 1</h2>
Once upon a time there was a little girl named sally, she went to school.
<p>One day it was awesome!</p>
<h2>Chapter 2</h2>
<p>We all had a parade!</p>

正如我在开头所说的那样,这不能 100% 工作,而且正如你所看到的,一个段落没有添加到第一段中。我可以做些什么来改进正则表达式?

你可以一步到位:

$this->string = preg_replace('~(*BSR_ANYCRLF)'R'R'K(?>[^<'r'n]++|<(?!h[1-6]'b)|'R(?!'R))+(?='R'R|$)~u',
                             '<p>$0</p>', $this->string);

图案详细信息

(*BSR_ANYCRLF)       # 'R can be any type of newline
'R'R                 # two newlines
'K                   # reset the match
(?>                  # open an atomic group
    [^<'r'n]++       # all characters except <, CR, LF
  |                  # OR
    <(?!h[1-6]'b)    # < not followed by a header tag
  |                  # OR
    'R(?!'R)         # single newline
)+                   # close the atomic group and repeat one or more times
(?='R'R|$)           # followed by to newlines or the end of the string

将 m switch 添加到第一个正则表达式。

// Converts sections to paragraphs:
$this->string = preg_replace("/(^|'n'n)(.+?)('n'n|$)/m", "<p>$2</p>", $this->string);
// To Remove paragraph tags from header tags (h1,h2,h3,h4,h5,h6,h7):
$this->string = preg_replace("/<p><h('d)>(.+?)<'/h'd><'/p>/i", "<h$1>$2</h$1>", $this->string);