Парсер разметки вики PHP - PullRequest
       22

Парсер разметки вики PHP

5 голосов
/ 11 августа 2011

Мне сказали, что написание PHP-анализатора вики-разметки на PHP, основанного на функциях regex и preg, - плохая идея.Но я не знаю почему.

Итак, как лучше всего написать на PHP разборщик вики-разметки?Это скорее академический «проект», чем все остальное, поэтому весь смысл в том, чтобы написать его самому.

Заранее благодарен за помощь.

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

Вам сказали это, потому что "вики-языки" плохо определены по меньшей мере.
Действительно плохая часть - "пытается разобрать" их, а не "используя php и regexps" .

На самом деле я считаю, что они фактически обрабатываются с помощью регулярных выражений (прямо в html, без перехода от промежуточного представления дерева абстрактного синтаксиса) в таких программах, как mediawiki, А фактический разбор AFAIK без регулярных выражений довольно неэффективен в PHP. (если вы не используете специальный скомпилированный модуль PHP для анализа)

Имейте в виду, что эти программы также имеют ряд синтаксических функций, которые можно активировать по требованию , и которые могут оказаться трудными для эффективной записи.

Только настоящие проблемы? Для разбора символов, таких как [ и ], вам нужно использовать много экранированных символов, легко запутаться, если вы используете много обратных слешей с preg_match() и php. Кроме того, простой preg_match_all('#\\[\\[(.*?)\\]\\]#',$data,$matches,PREG_SET_ORDER); должен заставить вас работать.

(если меня не смутило слишком много уровней обратной слеш, то есть) :)

2 голосов
/ 11 августа 2011

Вероятно, проблема в том, что вы должны запускать свои регулярные выражения по одному за раз по всему содержимому вики-страницы, а это занимает много времени на обработку.Простое решение - использовать какой-либо разделитель для тегов, например [[, и вы обрабатываете текст последовательно от начала до конца.Каждый раз, когда вы находите тег, вы ищете конечный тег ]].

Затем вы обрабатываете содержимое между теми правилами, которые вы определили.Это может быть достигнуто с помощью простых операций индексации и замены строк, при этом не требуется многократно обрабатывать всю строку, а вместо этого можно пропустить всю строку только один раз.

...