PHP - Разбор вложенных массивов - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь создать простой механизм правил синтаксического анализа, который может анализировать текст в соответствии с некоторыми правилами синтаксического анализа, которые может определить пользователь.

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

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...