我正在尝试创建一个简单的解析规则引擎,该引擎可以根据用户可以定义的某些解析规则来解析文本。
我遇到的问题是我的用户当前可以通过两种方式将文本保存到我的数据库中:
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"]
,则无法解析内容,因为列数据嵌套在列和行中。 / p>
我想允许它也解析列数据(例如,仅在第2列执行文本替换,或在第1列第1行的所有内容均大写。