繁体   English   中英

PHP-如何用正则表达式按条件替换字符串

[英]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}之后的所有内容保持不变。

正则表达式:

(?s)(?<=\{literal\}).*?(?=\{\/literal\})(*SKIP)(*F)|([{}])

替换字符串:

\1\1

演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM