Regex (php)匹配单个[或单个],但忽略[[]]之间的任何内容?



我有一个字符串,在它里面会有[][[]][的组合,但我需要用<和比;[[]].>

我认为我可以用一个正则表达式来做到这一点,但我真的很难让它工作,因为目前的复杂性超出了我的能力范围。

字符串示例:

[a] [b]  <- should replace every [ with < and every ] with > so <a> <b>
[a][b]   <- should replace every [ with < and every ] with > so <a><b>
[[abc][a][b]]  <- should not replace anything. will always start with [[ and end with ]]

从逻辑上考虑,我可以在PHP的循环中做这个但是如果可能的话,我想尝试使用preg_replace

逻辑,据我所知是用<和>除了在[[和]]之间,但我不确定我是否可以在正则表达式中做到这一点。我可以通过使用向前看/向后看使它部分工作,但仍然会在[[和]]之间匹配[和](例如[[[a]]])。

到目前为止我有

/(?<!(^|)[)[[^][[]*]/gmi

努力发现[a]而不是[[a]],但如果我有[[a [b] c]],就会失败。在这一点上,我不担心替换,我只需要让regex工作匹配/不匹配。

可以使用

preg_replace('~([[(?:(?![[|]]).|(?1))*]])(*SKIP)(*F)|[([^][]*)]~s', '<$2>', $text)

参见PHP演示和正则表达式演示。

细节:

  • ([[(?:(?![[|]]).|(?1))*]])(*SKIP)(*F)-第1组:[[,零次或多次出现的任何字符不是[[]]字符序列的起点或整个第1组模式递归,然后是]],一旦找到匹配,就跳过它,新的搜索从失败位置
  • 开始
  • |-或
  • [([^][]*)]-[,然后捕获[]以外的零或多个字符到组2,然后是]

最新更新