Разбор пользовательских тегов, чтобы получить атрибуты для разбора данных - PullRequest
0 голосов
/ 20 июня 2010

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

Я уверен, что смогу закодировать какой-нибудь "парсер", который будет проходить каждую строку вручную, но разве сегодня нет более разумного способа?

Данные мысли:

{Телефон: 555-123456789}

здесь у нас есть «телефон» - ключ, а номер - данные. Очень похоже на формат JSON, но его легче писать для человека.

или

{link:   article123456  ;    title:    Read about article 123456 here   } 

Может быть и обычным (X) HTML:

<a         href="article123456.html"      >  Read about article 123456 here  </a>

Людям не всегда приятно «обрезать» свои входные данные, как и старые веб-сайты, созданные с помощью ленивых редакторов WYSIWYG, поэтому мне сначала нужно выяснить, какие пары принадлежат друг другу, а затем, после нахождения «данных внутри», затем обрезать результаты .

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

Есть мысли о том, как получить эти данные наилучшим образом? Кажется, есть несколько способов, которые могут сработать, но каков ваш лучший подход к этой проблеме?

1 Ответ

2 голосов
/ 20 июня 2010

Я бы сначала написал «токенизатор» для синтаксиса данных, которые я анализировал. Токенизатор - это (относительно) простой процесс, который разбивает строку на ряд фрагментов или токенов. Например, в первых двух случаях ваши основные токены будут состоять из: "{", "}", ":", ";", а все остальное будет интерпретировано как токен данных. Это можно сделать с помощью цикла, рекурсивной функции или ряда других способов. Токенизация вашего второго примера создаст массив (или какой-то другой вид списка) со следующими значениями:

"{", "link", ":", "   article123456  ", ";", "    title", ":", "    Read about article 123456 here   ", "}"

Следующим шагом будет «очистить» ваши данные, хотя в этих случаях все, что на самом деле означает, - это удаление нежелательных пробелов. Выполните итерацию по созданному массиву токенов и измените каждый токен, чтобы не было начальных или конечных пробелов. Этот шаг можно сочетать с токенизацией, но я думаю, что гораздо проще и понятнее делать это отдельно. Тогда ваши токены будут выглядеть так:

"{", "link", ":", "article123456", ";", "title", ":", "Read about article 123456 here", "}"

И, наконец, фактическая «интерпретация». Вам нужно будет преобразовать ваш массив токенов в любую фактическую структуру данных, которую вы собираетесь использовать в качестве конечного продукта процесса синтаксического анализа. Для этого вам определенно понадобится рекурсивная функция. Если функция вызывается для токена данных, за которым следует токен двоеточия, за которым следует токен данных, она будет интерпретировать их в паре ключ-значение и, соответственно, создаст структуру данных. Если он вызывается для серии токенов с точками с запятой, он разбивает токены на каждую точку с запятой и вызывает себя в каждой из полученных групп. И если он вызывается на токенах, содержащихся в фигурных скобках, он будет вызывать себя на содержащихся токенах, прежде чем делать что-либо еще. Обратите внимание, что это не обязательно порядок, в котором вы хотите проверять эти различные случаи; в частности, если вы намереваетесь вложить фигурные скобки (или любой другой вид группировочных токенов, например квадратные скобки, угловые скобки или круглые скобки), вы должны будете затем интерпретировать эти токены в правильном порядке вложенности. 1007 *

Результатом этих процессов будет полностью проанализированная структура данных любого типа, который вы захотите. Имейте в виду, что этот процесс предполагает, что все ваши данные неявно хранятся как строковый тип; если вы хотите, чтобы «3» и «3» интерпретировались по-разному, то все становится немного сложнее. Этот метод, который я описал, вовсе не является единственным способом сделать это, но это то, как я подхожу к проблеме.

...