La un proiect recent a trebuit să implementez rapid două funcționalități din sintaxa markdown: link-uri și imagini. Iată cum am procedat.
Link-uri
Sintaxa markdown pentru link-uri este [anchor](url)
, prin urmare trebuie să căutăm în text un pattern de acest gen:
function ntz_parseMarkdownLinks($text)
{
do {
preg_match('/\[(.*?)\]\((.*?)\)/', $text, $matches);
if (!empty($matches)) {
$link = sprintf('<a href="%s">%s</a>', esc_attr($matches[2]), esc_attr($matches[1]));
$text = str_replace($matches[0], $link, $text);
}
} while (!empty($matches)); // iterăm textul de mai multe ori, până nu mai găsim pattern-ul link-urilor
return $text;
}
Imagini
Sintaxa markdown pentru imagini este ![titlu opțional](url imagine)
, prin urmare este nevoie doar de două schimbări minore: pattern-ul și tag-ul înlocuit:
function ntz_parseMarkdownImages($text)
{
do {
preg_match('/\!\[(.*?)\]\((.*?)\)/', $text, $matches);
if (!empty($matches)) {
$link = sprintf('<img src="%s" title="%s" />', esc_attr($matches[2]), esc_attr($matches[1]));
$text = str_replace($matches[0], $link, $text);
}
} while (!empty($matches));
return $text;
}
Cum folosim aceste funcții?
add_filter('the_content', 'ntz_parseMarkdownImages');
add_filter('the_content', 'ntz_parseMarkdownLinks');
Pentru comentarii:
add_filter('get_comment_text', 'ntz_parseMarkdownImages');
add_filter('get_comment_text', 'ntz_parseMarkdownLinks');
Pentru un string oarecare:
$str = ntz_parseMarkdownLinks($text);
Probleme
Din cauza faptului că cele două sintaxe sunt foarte asemănătoare, este importantă ordinea în care sunt executate cele două: întâi imaginile, apoi link-urile.