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

时间:2018-08-27 10:18:16

标签: php regex preg-replace

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

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>是否是集合的一部分。请帮助我扩展此范围,以便它满足我的需求。

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

1 个答案:

答案 0 :(得分:1)

尝试一下。第一个捕获组将在标签之间保存数据。

(?:(?<!<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>