Ваша правка показывает, что вы пытаетесь выполнить рекурсивное сопоставление, которое сильно отличается от исходного вопроса. Если бы вы не просто удалили сопоставленный текст, я бы посоветовал вам вообще не использовать регулярные выражения, но это должно делать то, что вы хотите:
$wikicode=preg_replace('~{{(?:(?:(?!{{|}}).)++|(?R))*+}}~s',
'', $wikicode);
После того, как первый {{
соответствует открывающему разделителю, (?:(?!{{|}}).)++
поглощает все до следующего разделителя. Если это еще один открывающий разделитель, (?R)
вступает во владение и снова применяет все регулярные выражения, рекурсивно.
(?R)
примерно так же нестандартен, как и возможности регулярных выражений. Он уникален для библиотеки PCRE, которая является основой PHP-выражения. У некоторых других ароматов есть свои собственные способы сопоставления рекурсивных структур, все они сильно отличаются друг от друга.