正则表达式 / preg_match / str_replace 有复杂字符串的问题

Trouble with regex / preg_match / str_replace with complicated string

我在处理复杂的正则表达式时遇到问题。我已经尝试了所有我能想到的方法,但我总是只能得到 "almost" --

我有 5 条消息:

---Agent 1: Wednesday 08/16/2017 | 11:43 AM ---

Message 1

--- Agent 1: Friday 06/09/2017 | 9:02 AM ---

Message 2

--- Agent 1: Friday 04/14/2017 | 10:35 AM ---

Message 3

--- Agent 1: Monday 02/13/2017 | 12:07 AM ---

This

is

message

3

 --- Agent 1: Monday 12/19/2016 | 1:31 PM ---

 Message 4 

 --- Agent 1: Monday 10/24/2016 | 10:48 AM ---

 Message 5

一个问题是其中一些在第一个 --- 之前有一个 space。另一个是多行消息。

我想做的是剥离所有单独的消息。基本上是 --- 第一次出现和此后每隔一次出现之间的所有内容。我希望我的 结果 看起来像:

---Agent 1: Wednesday 08/16/2017 | 11:43 AM ---

Message 1

我尝试了 ---.*? (---) 的变体(相互匹配 ---)但是我无法解析消息本身。我也尝试过手动执行此操作:

(?<=\: )(.*?)(?= \|)|(\---)(\r\n|\r|\n)(\r\n|\r|\n)(.*?)(\r\n|\r|\n)(\r\n|\r|\n)(\---)

在您收到多行消息之前,该方法一直有效。 (消息 3)

我也尝试了多个步骤 -- trimming 第一个或最后一个 --- 使用 str_replace 但这被前面有 space 的步骤挫败了!

总是时间之后的第二个---,多行消息,或者前面的space 之前 --- 把我绊倒了。有没有人有比我正在创建的怪物更优雅的解决方案?

代码

See regex in use here

-{3}.*[\s\S]*?(?=\s*(?:-{3}|$))

说明

  • -{3} 恰好匹配连字符 3 次
  • .* 匹配任意字符任意次数(贪心)
  • [\s\S]*? 匹配任何字符任意次数,但尽可能少(懒惰)
  • (?=\s*(?:-{3}|$)) 正向前瞻确保后续匹配
    • \s*匹配任意数量的空白字符
    • (?:-{3}|$) 匹配以下任意一项
      • -{3} 恰好匹配连字符 3 次
      • $ 断言行尾的位置
/---.*---\s*\R.*(?=---|$)/gsU

---.*---\s*\R - 选择带有消息描述的第一行。比 .*(?=---|$) 获取消息的其余部分直到下一条 (---) 的开头或字符串的结尾。

Demo and a little explanation