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'
(\[li\b[^]]*].*?\[\/li])
- 第 1 组:[li...]...[/li]
子字符串(请注意,带有 s
修饰符的 .*?
将跨行匹配,并将匹配除换行符以外的任何 0+ 个字符尽可能少,这样它就不会溢出多个 li
个元素。)
(?:\R*(?1))*
- 零个或多个序列:
\R*
- 零个或多个换行符
(?1)
- 与第 1 组相同的模式(见上文)
(*SKIP)(*F)
- 从缓冲区中删除匹配值
|
- 或
(\R)
- 匹配并捕获第 2 组的换行符。
替换是第 2 组中的值乘以 2(</code>,其中 <code>
引用存储在第 2 组中的值)。
我正在尝试替换可能出现多次的字符串。它以特定字符串开始和结束:
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'
(\[li\b[^]]*].*?\[\/li])
- 第 1 组:[li...]...[/li]
子字符串(请注意,带有s
修饰符的.*?
将跨行匹配,并将匹配除换行符以外的任何 0+ 个字符尽可能少,这样它就不会溢出多个li
个元素。)(?:\R*(?1))*
- 零个或多个序列:\R*
- 零个或多个换行符(?1)
- 与第 1 组相同的模式(见上文)
(*SKIP)(*F)
- 从缓冲区中删除匹配值|
- 或(\R)
- 匹配并捕获第 2 组的换行符。
替换是第 2 组中的值乘以 2(</code>,其中 <code>
引用存储在第 2 组中的值)。