Анализатор разметки PHP вики


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

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

Заранее спасибо за вашу помощь.

Author: VettelS, 2011-08-11

2 answers

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

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

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

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

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

 4
Author: ZJR, 2013-06-10 12:39:28

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

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

 2
Author: mellamokb, 2011-08-11 01:35:38