[英]PHP - How can regex replace a string by condition
我有一个字符串:
{include "abc"}
{literal}
function xyz() {
"ok";
}
{/literal}
{abc}
{123 }
我只想替换{literal}
标签中的所有{
到{{
和}
到}}
。 结果将是:
{{include "abc"}}
{{literal}}
function xyz() {
"ok";
}
//... something contain { and }
{{/literal}}
{{abc}}
{123 }}
有人可以帮助我,谢谢
您可以使用以下模式进行操作:
$pattern = '~(?:(?<={literal})[^{]*(?:{(?!/literal})[^{]*)*+|[^{}]*)([{}])\K~'
$text = preg_replace($pattern, '$1', $text);
图案细节:
~ # pattern delimiter
(?: # non-capturing group
(?<={literal}) # lookbehind: preceded by "{literal}"
# a lookbehind doesn't capture any thing, it is only a test
[^{]* # all that is not a {
(?:
{(?!/literal}) #/# a { not followed by "/literal}"
[^{]*
)*+ # repeat as needed
| # OR
[^{}]* # all that is not a curly bracket,
# (to quickly reach the next curly bracket)
)
([{}]) # capture a { or a } in group 1
\K # discards all on the left from match result
# (so the whole match is empty and nothing is replaced,
# the content of the capture group is only added
# with the replacement string '$1')
~
注意:此模式假定{literal}
不能嵌套且始终关闭。 如果{literal}
可以保持未关闭状态,则可以强制执行以下默认行为: “未关闭的{literal}
被视为处于打开状态,直到字符串结尾” 。
为此,您可以将捕获组更改为([{}]|(*COMMIT)(*F))
。 当第一个分支[{}]
失败时,这意味着到达字符串的结尾。 (*COMMIT)
动词在模式失败后强制正则表达式引擎停止字符串中的所有研究,而(*F)
强制其失败。 因此{literal}
之后的所有内容保持不变。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.