I would like to create a simple markdown, for bold and italic for now only, for example:
-
**foo**
turns<b>foo</b>
-
__bar__
turns<i>bar</i>
Of course some details are needed, for example in italian this can not work:
__ foo __
Because this is separate, the first and last letter should be attached to the "delimiters" , however this would be valid:
__foo bar__ => <i>foo bar</i>
__f o o b a r__ => <i>f o o b a r</i>
Because spaces between the first and last letter are accepted.
At the moment I created this:
-
Bold:
$str = preg_replace('#(^|[^\*])\*\*([^\s\*]([^\*]+?)?[^\s\*])\*\*([^\*]|$)#', '$1<b>$2</b>$4', $str);
-
Italic:
$str = preg_replace('#(^|[^_])__([^\s_]([^_]+?)?[^\s_])__([^_]|$)#', '$1<i>$2</i>$4', $str);
Both are very similar and seem to work fine, to better explain regx:
(^|[^_])__([^\s_]([^_]+?)?[^\s_])__([^_]|$)
^ ^ ^ ^ ^ ^ ^
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
| | | | | | +-- verifica se após o delimitador não é underscore ou se é o final da string
| | | | | |
| | | | | +-- verifica se o delimitador são 2 underscores
| | | | |
| | | | +-- o ultimo caractere antes do delimitador não pode ser espaço e nem underscore
| | | |
| | | +-- pega qualquer coisa que não seja underscore, esse grupo é opicional
| | |
| | +-- verifica se o que vem após o primeiro delimitador é diferente de espaço e diferente de underscore
| |
| +-- verifica se o delimitador são 2 underscores
|
+-- checa se é o começo da string ou se o que vem antes do delimitador é diferente de underscore _
Example on ideone: link
However, the way I did regex can not do this:
__foo_bar__
And not even this:
**foo*bar**
I would like some improvement suggestions on this or even something totally different from this, even if it is without regex.