preg_replace 有一些条件

preg_replace with some conditions

我正在尝试替换可能出现多次的字符串。它以特定字符串开始和结束:

some text
more text here
[li]......[/li]
[li]......[/li]
[li]......[/li]

我可以检查 [li] 之前的字符串和 [li] 如果在 [li][ 之前=29=] 是一个字符串,但不是 [/li] 然后用相同的模式替换它,除了换行符用正则表达式加倍?

我要检查的内容:

some strings 
\n // Replace this one
[li]some strings[/li] \n 
[li]some strings[/li] \n // This one is not replaced, because the string before this [li] were [/li]
[li]some strings[/li] \n
some strings

条件满足就这样

some strings 
\n\n // With this one instead
[li]some strings[/li] \n
[li]some strings[/li] \n
[li]some strings[/li] \n
some strings

到目前为止,这是我的代码,但我无法得到我想要的:

$data = preg_replace("/(.*)\([\n]/\[li\]/s", "[result]", $data);

您可以使用

'~(\[li\b[^]]*].*?\[\/li])(?:\R*(?1))*(*SKIP)(*F)|(\R)~s'

regex demo

  • (\[li\b[^]]*].*?\[\/li]) - 第 1 组:[li...]...[/li] 子字符串(请注意,带有 s 修饰符的 .*? 将跨行匹配,并将匹配除换行符以外的任何 0+ 个字符尽可能少,这样它就不会溢出多个 li 个元素。)
  • (?:\R*(?1))* - 零个或多个序列:
    • \R* - 零个或多个换行符
    • (?1) - 与第 1 组相同的模式(见上文)
  • (*SKIP)(*F) - 从缓冲区中删除匹配值
  • | - 或
  • (\R) - 匹配并捕获第 2 组的换行符。

替换是第 2 组中的值乘以 2(</code>,其中 <code> 引用存储在第 2 组中的值)。