【问题标题】:preg_replace match single but not double occurances of a stringpreg_replace 匹配字符串的单次但不是两次出现
【发布时间】:2018-08-27 10:18:16
【问题描述】:

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

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

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

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

&lt;br&gt; 的出现可以是完全随机的。

<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"

它只在触发器之前或之后匹配可能的单个&lt;br&gt;,而不关心&lt;br&gt; 是否是集合的一部分。请帮我扩展它,让它满足我的需要。

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

【问题讨论】:

  • 谢谢,因为我忘了提,所以让我扩展一下。有时在触发器之前根本没有休息,我也需要匹配这些触发器。基本上我想匹配触发器,并且在之前或之后(但不是双重)有一个中断时将其包含在匹配中,以便我可以替换。
  • 需要匹配整个触发器+
    之前或之后的单次出现(但不是两次)
  • 感谢您这样做。用示例文本的链接更新了我的问题。

标签: php regex preg-replace


【解决方案1】:

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

(?:(?&lt;!&lt;br&gt;)&lt;br&gt;)?\[trigger\]([\s\S]*?)\[\/trigger\](?:&lt;br&gt;(?!&lt;br&gt;))?

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>

【讨论】:

  • 当有双重中断时,我希望匹配忽略它们并匹配触发器。当有一个时,我想被包含在匹配的字符串中
  • 这个正则表达式仍然匹配一个
    而它旁边还有另一个,这是我不想要的。
  • 已修复!请您再检查一遍好吗?
  • 更新了!为了获取数据正链标签,只需查看第二个捕获组
  • @Zhi 匹配trigger前后有两个&lt;br&gt; - regex101.com/r/J1aNCd/5
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2013-05-23
  • 2011-10-25
相关资源
最近更新 更多