我有一个字符串,在它里面会有[][[]][的组合,但我需要用<和比;[[]].>
我认为我可以用一个正则表达式来做到这一点,但我真的很难让它工作,因为目前的复杂性超出了我的能力范围。
字符串示例:
[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,然后是]
。