什么是正则表达式替换/删除END之前没有未开始的START?

New*_*php 4 php regex preg-replace

什么是正则表达式(PHP)来替换/删除(使用preg_replace())END,其中没有未开始的START?

以下是一些描述我的意思的例子:

例1:

输入:

sometext....END
Run Code Online (Sandbox Code Playgroud)

输出:

sometext.... //because theres no START, therefore no need for the excess END
Run Code Online (Sandbox Code Playgroud)

例2:

输入:

STARTsometext....END
Run Code Online (Sandbox Code Playgroud)

输出:

STARTsometext....END //because its preceded by a START
Run Code Online (Sandbox Code Playgroud)

例3:

输入:

STARTsometext....END.......END
Run Code Online (Sandbox Code Playgroud)

输出:

STARTsometext....END....... //because the END is not preceded by a START
Run Code Online (Sandbox Code Playgroud)

希望有人能帮忙吗?

谢谢.

Kob*_*obi 8

假设您没有寻找嵌套对,有一个简单的解决方案来恢复多余的END.考虑:

$str = preg_replace("/END|(START.*?END)/", "$1", $str);
Run Code Online (Sandbox Code Playgroud)

这是一个稍微向后的替代,但如果您了解引擎的工作顺序,这是有道理的.首先,正则表达式由两个主要部分组成: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