preg_replace有一些条件

时间:2017-08-30 04:05:50

标签: php regex codeigniter replace preg-replace

我试图替换可能多次出现的字符串。它以特定字符串开头和结尾:

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

我可以在 [li] [li] 之前检查字符串,如果 [li] 之前是字符串但不是< strong> [/ 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);

1 个答案:

答案 0 :(得分:0)

您可以使用

'~(\[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组的值($1$1,其中$1引用存储在第2组中的值。)