Php 匹配特定字符后括号中的所有内容

Php 匹配特定字符后括号中的所有内容,php,regex,Php,Regex,我有以下字符串: $text = 'These are my cards. They are {{Archetype|Agumon}} and {{Fire|Gabumon}}' 我正在尝试将所有出现的实例(如{{Archetype | Agumon}}替换为[Agumon]) 我一直在努力想办法解决这个问题,到目前为止我已经想到了: $string = preg_replace('#\{\{(.*?)\}\}#', '[$1]', $text); 这导致: 这些是我的名片。它们是[原型|阿

我有以下字符串:

$text = 'These are my cards. They are {{Archetype|Agumon}} and {{Fire|Gabumon}}'
我正在尝试将所有出现的实例(如
{{Archetype | Agumon}}
替换为
[Agumon]

我一直在努力想办法解决这个问题,到目前为止我已经想到了:

$string = preg_replace('#\{\{(.*?)\}\}#', '[$1]', $text);
这导致:

这些是我的名片。它们是[原型|阿格蒙]和[火|加布蒙]

因此,我目前正在匹配双花括号之间的全文

我想应该是这样的:
\\\\\\(.*)
在花括号中的
\
字符后获得匹配,但没有效果。

您可以使用:

\{\{[^}]*\|([^}]*)\}\}

细分:

  • \{
    -按字面意思匹配“{{”
  • [^}]*
    -贪婪地匹配除“}”以外的零个或多个字符
  • \\\124;
    -匹配管道字符
  • ([^}]*)
    -匹配除“}”以外的零个或多个字符,并在组1中捕获它们
  • \}
    -按字面意思匹配“}”
使用

preg\u replace('/{{(?:(?!{{124;}})[^}]*\\\\\(.*)}}/s','[$1]',$text)
看。它将在管道之前的零件中支持
{
}

解释

--------------------------------------------------------------------------------
{{                       '{{'
--------------------------------------------------------------------------------
(?:组,但不捕获:
--------------------------------------------------------------------------------
(?!向前看,看看是否有:
--------------------------------------------------------------------------------
{                        '{'
--------------------------------------------------------------------------------
|或
--------------------------------------------------------------------------------
}}                       '}}'
--------------------------------------------------------------------------------
)展望的结束
--------------------------------------------------------------------------------
[^ |]*除“|”(0或更多)以外的任何字符
次数(与最大金额匹配)
(可能的)
--------------------------------------------------------------------------------
\|                       '|'
--------------------------------------------------------------------------------
(组和捕获到\1:
--------------------------------------------------------------------------------
*?任何字符(0或更多)
次数(匹配最小金额)
(可能的)
--------------------------------------------------------------------------------
)结束\1
--------------------------------------------------------------------------------
)分组结束
--------------------------------------------------------------------------------
}}                       '}}'
:

$text='这些是我的卡片。它们是{原型{Agumon}}和{Fire{Gabumon}}};
echo preg_replace('/{{(((?!{}})[^[124;]*\\\\\.(.*)}}}/s','[$1]',$text);

结果
这些是我的卡片。它们是[Agumon]和[Gabumon]

您可能想要
\{{{[^}]*\\\\\\\\\\\\\\\;([^}]*)\}
。非常感谢。就这样。还感谢您提供的有用链接,该链接解释了它的工作原理,非常有用。