Преобразование формата вики в XHTML

У меня есть база данных, в которой хранится текст в формате «wiki», который я хотел бы отображать в XHTML с помощью PHP.

Вот пример вывода со всей разметкой вики:

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://domain.com/image.png|Image name]]

[http://google.com Link text goes here]

> Blockquote

<source lang="language">Source code</source>

Это довольно стандартный синтаксис вики? Есть ли стандартный способ интерпретации с помощью PHP?

Заранее спасибо!


person Al.    schedule 09.08.2009    source источник
comment
не забывайте теги ‹nowiki› foobar ‹/nowiki›   -  person Chris Dale    schedule 10.08.2009


Ответы (5)


Я бы сказал, что сегодня наиболее стандартным википодобным форматом является markdown. Существуют библиотеки, доступные практически для любой платформы, включая PHP.

person troelskn    schedule 09.08.2009
comment
уценка выглядит фантастически! Как и класс PHP. К сожалению, форматирование не соответствует моей строке - если бы у меня был контроль над данными, я бы выбрал уценку :) - person Al.; 10.08.2009
comment
markdown не делает основ, вам нужно загрузить другой файл, чтобы сделать это. Все еще ищите базовый конвертер для wiki2html, работающий по принципу "все включено" - person andrebruton; 17.09.2011

MediaWiki написан на PHP и распространяется по лицензии GPL. Итак, вы можете просто взять конвертер WikiText и использовать его.

person Gumbo    schedule 09.08.2009

Да, это похоже на довольно стандартный формат вики. Я создал несколько вики-решений PHP с использованием пакета PEAR Text_Wiki. Он делает именно то, что вы хотите, и вы даже можете расширить его, чтобы поддерживать любой настраиваемый синтаксис и переводить в соответствии с любым правилом.

http://pear.php.net/package/Text_Wiki

person Dan Gøran Lunde    schedule 09.08.2009
comment
text_wiki тоже отлично выглядит! Но мое форматирование не соответствует этому. Моя строка нестандартная, я подозреваю - person Al.; 10.08.2009
comment
Вы также можете добавить свои собственные правила в text_wiki. Тогда вы сможете поддерживать любой тип Wiki. - person Dan Gøran Lunde; 11.08.2009

Я придумал хак, но он ломается во многих вещах. Это лучший путь вперед?

PHP:

function wiki2html($text)
{
        $text = preg_replace('/&lt;source lang=&quot;(.*?)&quot;&gt;(.*?)&lt;\/source&gt;/', '<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('/&lt;s&gt;(.*?)&lt;\/s&gt;/', '<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('/&gt;(.*?)\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://domain.com/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://domain.com/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>
person Al.    schedule 09.08.2009
comment
Похоже, мой строковый формат не является стандартным викиформатом, поэтому я высокомерно приму свой ответ. Если кто-то может улучшить мой код, пожалуйста, не стесняйтесь! - person Al.; 15.08.2009
comment
Я использовал урезанную версию вашего кода для синтаксического анализа вики-текста, последний абзац не закрывается вашей версией. Я использовал слегка измененный конец: $ text = str_replace (\ r \ n \ r \ n, '‹/p› ‹p›, $ text, $ count); if ($ count ›0) $ text. = '‹/p›'; - person Duncan; 30.08.2010
comment
Добавлена ​​горизонтальная линия $text = preg_replace('/----/', '<hr />', $text); - person andrebruton; 17.09.2011
comment
Не забывайте про уборку! $text = preg_replace('%<p>(<h\\d>.*?</h\\d>)</p>%', '$1', $text); $text = preg_replace('%<p>(<ul>.*?</ul>)</p>%', '$1', $text); $text = preg_replace('%<p>(<ol>.*?</ol>)</p>%', '$1', $text); - person redolent; 25.11.2012

Это будет во многом зависеть от того, какой язык вы используете для синтаксического анализа.

На стороне клиента с Javascript?

На стороне сервера с ASP или PHP?

person Chris Sobolewski    schedule 09.08.2009
comment
Я использую PHP. Я добавил это в теги, но забыл упомянуть в вопросе! - person Al.; 10.08.2009