我试图替换可能多次出现的字符串。它以特定字符串开头和结尾:
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);
答案 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组中的值。)