Анализатор разметки PHP вики
Мне сказали, что написание анализатора разметки вики на PHP, который использует регулярные выражения и функции preg, - плохая идея. Но я не знаю, почему.
Итак, как лучше всего написать анализатор разметки вики на PHP? Это скорее академический "проект", чем что-либо еще, так что весь смысл в том, чтобы написать его самому.
Заранее спасибо за вашу помощь.
2 answers
Вам сказали это, потому что "языки вики" плохо определены, если не сказать больше.
Действительно плохая часть - это "попытка проанализировать" их, а не "с использованием php и регулярных выражений".
На самом деле я считаю, что они на самом деле обрабатываются регулярными выражениями ( прямо в html, без перехода от промежуточного представления абстрактного синтаксического дерева) в таких программах, как mediawiki. И фактический синтаксический анализ AFAIK без регулярных выражений довольно неэффективен в PHP. (если только вы не используете специальный скомпилированный модуль PHP для синтаксического анализа)
Имейте в виду, что эти программы также имеют ряд синтаксических функций, которые могут быть активированы по требованию , и которые могут оказаться трудными для эффективного написания.
Только настоящие проблемы? Вам нужно использовать много экранирований для анализа символов, таких как [
и ]
, легко запутаться, когда вы используете много обратных косых черт с preg_match()
и php. Кроме того, простой preg_match_all('#\\[\\[(.*?)\\]\\]#',$data,$matches,PREG_SET_ORDER);
должен поднять вас и бегущий.
( если только меня не смутило слишком много уровней обратной косой черты, то есть) :)
Вероятно, проблема в том, что вам нужно запускать регулярные выражения по одному по всему содержимому вики-страницы, а это занимает много времени на обработку. Простым решением является использование какого-либо разделителя для тегов, например [[
, и вы обрабатываете текст последовательно от начала до конца. Каждый раз, когда вы находите тег, вы ищете конечный тег ]]
.
Затем вы обрабатываете промежуточное содержимое с помощью любых определенных вами правил. Это может быть выполняется с использованием простых операций индексирования и замены строк и не требует многократной обработки всей строки, а вместо этого проходит через всю строку только один раз.