preg_replace 匹配出现一次但不出现两次的字符串

preg_replace match single but not double occurances of a string

我想知道如何匹配这个例子:

https://regex101.com/r/wmvSDY/1

我需要能够替换触发器之前或之后出现的单次(也不是强制性的)<br>,但不能替换两次。

<br>[trigger]...[/trigger]<br><br>  

<br> 的出现可以完全随机。

<br><br>[trigger]...
[/trigger]<br><br>

有效匹配:

 1. **[trigger]...[/trigger]<br>**
   2. **<br>[trigger]...[/trigger]**
   3. **<br>[trigger]...[/trigger]<br>**

我现在的 preg_replace 是这样的:

"/(?:<br>)?\[trigger\](.*?)\[\/trigger\](?:<br>)?/is"

它只匹配触发器之前或之后可能的单个 <br>,而不关心 <br> 是否是集合的一部分。请帮助我扩展它,以便它满足我的需要。

基本上我想匹配触发器,当之前或之后有一个中断(但不是两次)时将其包含在匹配中,这样我就可以替换 **

试试这个。第一个捕获组将保存标签之间的数据。

(?:(?<!<br>)<br>)?\[trigger\]([\s\S]*?)\[\/trigger\](?:<br>(?!<br>))?

Demo

解释

(?:(?<!<br>)<br>)?  # optional <br> without a previous <br>
\[trigger\]         # trigger tag
  ([\s\S]*?)        # any character 0 or more, lazy
\[\/trigger\]       # end trigger
(?:<br>(?!<br>))?   # optional <br> without an extra <br>