У меня есть база данных, хранящая текст «wiki formatted», который я хотел бы отображать в XHTML с помощью PHP.
Вот пример вывода со всей разметкой wiki:
Default text == Heading 1 == === Heading 2 === ==== Heading 3 ==== ===== Heading 4 ===== ====== Heading 5 ====== '''Bold''' ''Italic'' <s>Strikethrough</s> * List item 1 * List item 2 # Numbered item 1 # Numbered item 2 [[Image:http://img.ruphp.com/php/image.png|Image name]] [http://google.com Link text goes here] > Blockquote <source lang="language">Source code</source>
Это довольно стандартный вики-синтаксис? Есть ли стандартный способ интерпретации его с PHP?
Заранее спасибо!
Я бы сказал, что наиболее стандартным вики-подобным форматом сегодня является уценка . Существуют библиотеки, доступные практически для любой платформы, включая PHP .
MediaWiki написан на PHP и лицензирован под GPL . Таким образом, вы можете использовать конвертер WikiText и использовать его.
Да, это похоже на довольно стандартный вики-формат. Я создал несколько PHP-вики-решений, используя пакет PEAR Text_Wiki. Он делает именно то, что вы хотите, и вы можете даже расширить его, чтобы поддерживать любой настраиваемый синтаксис и переводить в соответствии с любым правилом.
Я придумал взломать, но это ломается во многих вещах. Это лучший способ продвижения вперед?
PHP:
function wiki2html($text) { $text = preg_replace('/<source lang="(.*?)">(.*?)<\/source>/', '<pre lang="$1">$2</pre>', $text); $text = preg_replace('/======(.*?)======/', '<h5>$1</h5>', $text); $text = preg_replace('/=====(.*?)=====/', '<h4>$1</h4>', $text); $text = preg_replace('/====(.*?)====/', '<h3>$1</h3>', $text); $text = preg_replace('/===(.*?)===/', '<h2>$1</h2>', $text); $text = preg_replace('/==(.*?)==/', '<h1>$1</h1>', $text); $text = preg_replace("/'''(.*?)'''/", '<strong>$1</strong>', $text); $text = preg_replace("/''(.*?)''/", '<em>$1</em>', $text); $text = preg_replace('/<s>(.*?)<\/s>/', '<strike>$1</strike>', $text); $text = preg_replace('/\[\[Image:(.*?)\|(.*?)\]\]/', '<img src="$1" alt="$2" title="$2" />', $text); $text = preg_replace('/\[(.*?) (.*?)\]/', '<a href="$1" title="$2">$2</a>', $text); $text = preg_replace('/>(.*?)\n/', '<blockquote>$1</blockquote>', $text); $text = preg_replace('/\* (.*?)\n/', '<ul><li>$1</li></ul>', $text); $text = preg_replace('/<\/ul><ul>/', '', $text); $text = preg_replace('/# (.*?)\n/', '<ol><li>$1</li></ol>', $text); $text = preg_replace('/<\/ol><ol>/', '', $text); $text = str_replace("\r\n\r\n", '</p><p>', $text); $text = str_replace("\r\n", '<br/>', $text); $text = '<p>'.$text.'</p>'; return $text; }
Входные данные :
Default text == Heading 1 == === Heading 2 === ==== Heading 3 ==== ===== Heading 4 ===== ====== Heading 5 ====== '''Bold''' ''Italic'' <s>Strikethrough</s> * List item 1 * List item 2 # Numbered item 1 # Numbered item 2 [[Image:http://img.ruphp.com/php/image.png|Image name]] [http://google.com Link text goes here] > Blockquote <source lang="language">Source code</source>
Вывод:
<p> Default text<br/> <h1> Heading 1 </h1><br/> <h2> Heading 2 </h2><br/> <h3> Heading 3 </h3><br/> <h4> Heading 4 </h4><br/> <h5> Heading 5 </h5><br/> <strong>Bold</strong><br/> <em>Italic</em><br/> <strike>Strikethrough</strike> </p> <p> <ul> <li>List item 1</li> <li>List item 2</li> </ul> <br/> <ol> <li>Numbered item 1</li> <li>Numbered item 2</li> </ol> <br/> <img src="http://img.ruphp.com/php/image.png" alt="Image name" title="Image name" /> </p> <p> <a href="http://google.com" title="Link text goes here">Link text goes here</a> </p> <p> <blockquote> Blockquote</blockquote><br/> <pre lang="language">Source code</pre><br/> </p>
Это будет зависеть от того, какой язык вы используете для синтаксического анализа.
Клиентская сторона с Javascript?
Серверная сторона с ASP или PHP?