gpt4 book ai didi

php - 如果 END 之前没有未结束的 START,那么替换/删除 END 的正则表达式是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:04:04 24 4
gpt4 key购买 nike

要替换/删除(使用 preg_replace())END 之前没有未结束的 START 的正则表达式 (PHP) 是什么?

这里有几个例子可以更好地说明我的意思:

示例 1:

输入:

sometext....END

输出:

sometext.... //because theres no START, therefore no need for the excess END

示例 2:

输入:

STARTsometext....END

输出:

STARTsometext....END //because its preceded by a START

示例 3:

输入:

STARTsometext....END.......END

输出:

STARTsometext....END....... //because the END is not preceded by a START

希望有人能提供帮助?

谢谢。

最佳答案

假设您不是在寻找嵌套对,有一个简单的解决方案可以消除多余的 END。考虑:

$str = preg_replace("/END|(START.*?END)/", "$1", $str);

这是一个有点向后的替换,但如果您了解引擎工作的顺序,它是有意义的。首先,正则表达式由两个主要部分组成:END|()。从左到右尝试交替,因此如果引擎在输入字符串中看到 END,它将匹配它并继续进行下一个匹配(即查找 END 再次)。
第二部分是捕获组,其中包含 START.*?END - 如果可能,这将匹配整个开始/结束标记。其他所有内容都将被跳过,直到找到另一个 END 或 START。

因为我们在替换中使用了 $1,这是捕获的组,所以我们只保存第二个标记。因此,END 生存的唯一方法是成为 START 之后的第一个捕获组。

例如,对于文本 END START 123 END abc END。正则表达式将找到以下匹配项,并相应地保留、跳过或删除它们:

  • END - 已删除
  • (START 123 END) - 捕获
  • a - 跳过
  • b - 跳过
  • c - 跳过
  • END - 已删除

工作示例:http://ideone.com/suVYh

关于php - 如果 END 之前没有未结束的 START,那么替换/删除 END 的正则表达式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4383068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com