while($next = (extract_bracketed($text, '{}', '[^{}]*' ))[0]) #this is general. { $holder = $next; if($bext = (extract_bracketed($next, '{}', '(?s).*?(?=\{ctext|\{code|\{example|\{pre)' ))[0]) #this handles "code" and the like. { $bolder = $bext; while($cext = (extract_bracketed($bext, '{}', '(?s).*?(?=\{escape)' ))[0]) #this is for escaped "code" and the like. { $colder = $cext; $cext =~ s/\{([^ \s|\}]*?)\}/<$1\/>/gix; $cext =~ s/\{([\w|-]*)(.*)\}/<$1>$2<\/$1>/osi; $bext =~ s/$colder/$cext/sgi; } $bext =~ s/\{pre(.*)\}/\$1<\/pre>/gosix; $bext =~ s/\{ctext(.*)\}/\$1<\/ctext>/gosix; $bext =~ s/\{code(.*)\}/\$1<\/code>/gosix; $bext =~ s/\{example(.*)\}/\$1<\/example>/gosix; $bext =~ s/\}/ebrac/g; $bext =~ s/\{/obrac/g; $next =~ s/$bolder/$bext/sgi; } $next =~ s/\{([^ \s|\}]*?)\}/<$1\/>/gix; $next =~ s/\{([\w|-]*)(.*)\}/<$1>$2<\/$1>/osi; $text =~ s/$holder/$next/sgi; }