Я пытаюсь создать простой механизм правил синтаксического анализа, который может анализировать текст в соответствии с некоторыми правилами синтаксического анализа, которые может определить пользователь.
Проблема, с которой я столкнулся, заключается в том, что мои пользователи в настоящее время могут сохранять текст в моей базе данных двумя способами:
documents
:
id | path | content
1 | /mydoc.txt | {"text":"My document text.\nIs awesome!\n\f"}
2 | /another.txt | {"column":[{"1":[{"1":"A line in column 1.\n"}],"2":[{"1":"Another line.\n"},{"2":"Yet another in column 2\n"}]}]}
Так что мои пользователи могут анализировать текстовую строку text:
и строки столбца / таблицы column:
Я создал класс, который может анализировать правила:
ApplyParsingRules.php
;
public function parseContent(array $content, Field $field)
{
if ($field->rules->count() > 0) {
$result['text'] = $this->parse($content, $field->rules);
$result = json_encode($result);
}
return $this->data->fields()->attach($field, ['content' => $result ?? null]);
}
/**
* Iterate through each rule and parse through the content.
*
* @return array
*/
public function parse(array $content, object $rules) : string
{
$results = [];
foreach ($rules as $rule) {
$class = $this->getClass($rule);
$content = $class->apply($content);
}
return $content;
}
public function getClass(FieldRule $FieldRule)
{
$arguments = unserialize($FieldRule->arguments);
$class = 'App\StreamParser\Parser\ParsingRules\Text\\' . Str::camel($FieldRule->method);
return new $class($arguments);
}
И это называется как:
$Parser = new ApplyParsingRules();
$result = $Parser->parseContent($content, $field);
Примером правила может быть textReplace.php
:
public function __construct(array $arguments)
{
$this->search = $arguments['search'];
$this->replace = $arguments['replace'];
}
public function apply(array $content): string
{
return str_replace($this->search, $this->replace, $content['text']);
}
Вышеуказанная настройка работает нормально. Я могу предоставить $content['text']
из базы данных, которая в основном:
My document text.\nIs awesome!\n\f
Однако, если я предоставлю $content["column"]
классу, я не смогу проанализировать содержимое, потому что данные столбца вложены в столбцы и строки .
Я хотел бы разрешить для этого также анализировать данные столбца (например, выполнять замену текста только в столбце 2 или использовать заглавные буквы в столбце 1, строке 1.