' . $text . ''; $link_count++; return $placeholder; }, $markdown); // Détection et conversion des URLs brutes en liens cliquables // 1. URLs avec protocole http/https $protocolUrlPattern = '/(https?:\/\/[^\s<]+[^\s<\.)])/i'; $markdown = preg_replace_callback($protocolUrlPattern, function($matches) use (&$links, &$link_count) { $url = $matches[1]; $placeholder = "___LINK_{$link_count}___"; $links[$placeholder] = '' . $url . ''; $link_count++; return $placeholder; }, $markdown); // 2. Domaines sans protocole (comme "o-k-i.net", "gong.gp", "NUVEL.NU") // Détecte les domaines avec TLD communs qui ne font pas partie d'autre chose $domainPattern = '/\b([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+([a-zA-Z]{2,63})\b/'; $markdown = preg_replace_callback($domainPattern, function($matches) use (&$links, &$link_count) { $domain = $matches[0]; // Éviter de convertir des éléments qui ressemblent à des versions/numéros ou qui sont déjà dans des liens if (preg_match('/^v?\d+\.\d+/', $domain) || strpos($domain, '___LINK_') !== false) { return $domain; } $placeholder = "___LINK_{$link_count}___"; $links[$placeholder] = '' . $domain . ''; $link_count++; return $placeholder; }, $markdown); // Conversion du texte en gras et italique (**texte** et *texte*) $markdown = preg_replace('/\*\*(.*?)\*\*/s', '$1', $markdown); $markdown = preg_replace('/\*(.*?)\*/s', '$1', $markdown); // Conversion des listes (à puces et numérotées) en une seule passe ligne à // ligne : les items consécutifs de même type forment une seule liste ; une // ligne hors liste ou un changement de type ferme la liste courante. $lines = explode("\n", $markdown); $markdown = ''; $listType = null; // 'ul', 'ol' ou null (hors liste) foreach ($lines as $line) { $itemType = null; $itemText = null; if (preg_match('/^- (.*)$/', $line, $matches)) { $itemType = 'ul'; $itemText = $matches[1]; } elseif (preg_match('/^\d+\. (.*)$/', $line, $matches)) { $itemType = 'ol'; $itemText = $matches[1]; } if ($itemType !== $listType) { if ($listType !== null) { $markdown .= '' . $listType . ">\n"; } if ($itemType !== null) { $markdown .= '<' . $itemType . ">\n"; } $listType = $itemType; } $markdown .= ($itemType !== null ? '