regex 正则表达式(php)匹配单个[或单个],但忽略[[ ]]之间的任何内容?

6rvt4ljy  于 2023-04-13  发布在  PHP
关注(0)|答案(1)|浏览(442)

我有一个字符串,其中将有[ ] ]的组合[但我需要用[和]替换单个[和],但< and >不要匹配之间的任何内容。
我想我可以用正则表达式来做这件事,但我真的很难让它工作,因为目前的复杂性超出了我的能力。
示例字符串:

[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。
我不确定我是否能在正则表达式中做到这一点。我可以通过使用lookahead/lookbehind来部分地使它工作,但是仍然可以在and 之间匹配[ and ](例如[ [a] ])。
到目前为止

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

如果我有a [b] c,则会失败。在这一点上,我不担心替换,我只需要让正则表达式匹配/不匹配。

axr492tv

axr492tv1#

你可以用

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

参见PHP demoregex demo

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

相关问题