【问题标题】:preg_replace with some conditionspreg_replace 有一些条件
【发布时间】:2017-08-30 04:05:49
【问题描述】:

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

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);

【问题讨论】:

  • @WiktorStribiżew 哇,它就像一个魔术。这就像我想要的,它给了我解释,谢谢!
  • @WiktorStribiżew,你能把它放在答案上吗?所以我可以标记为完成
  • 完成,请看下面的解释。
  • 很高兴它对你有用。如果我的回答对您有帮助,也请考虑投票(请参阅How to upvote on Stack Overflow?)。

标签: php regex codeigniter replace preg-replace


【解决方案1】:

你可以使用

'~(\[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 组中的值)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多