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)
希望有人能帮忙吗?
谢谢.
假设您没有寻找嵌套对,有一个简单的解决方案来恢复多余的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