http://qs321.pair.com?node_id=445804


in reply to Interpolate Text Not Inside a Certain Tag

An easily extendable solution:

{ for ($text) { # Alias $_ to $text. /\G `` (.*?) `` /gcsx && do { print($1 ); redo }; /\G \*\* (.*?) \*\* /gcsx && do { print("<b>$1</b>"); redo }; /\G ( . # Catchall. (?: # These four lines are optional. (?!``) # They are here to speed things up (?!\*\*) # by avoiding calling print for .)* # single characters. ) /gcsx && do { print($1); redo }; } }

Handles mismatched ** and `` by treating them as normal characters.

Update:

Tested:

foreach ( '**bold**', '``**bold**``', '**``bold``**', '**bold** test ** test', '``text`` test `` test', ) { print('in: ', $_, $/, 'out: '); TOKENIZER: { ... } print($/, $/); } __END__ in: **bold** out: <b>bold</b> in: ``**bold**`` out: **bold** in: **``bold``** out: <b>``bold``</b> in: **bold** test ** test out: <b>bold</b> test ** test in: ``text`` test `` test out: text test `` test