Разбор YAML Front Matter с помощью PHP - PullRequest
3 голосов
/ 13 августа 2011

У меня YAML Front Matter , который я хочу проанализировать с помощью PHP:

---
title = A nice title goes here
tags = tag1 tag2 tag3
---
This is the content of this entry...
Line2
Line3

Я знаю, что это что-то вроде Ruby, но я хочу использовать это в PHP для создания удобного движка блогов для плоских файлов.

У меня также есть фрагмент из проекта под названием Phrozn. Возможно, вам, ребята, будет полезно увидеть это, чтобы помочь мне решить проблему как можно лучше.

private function parse()
{
    if (isset($this->template, $this->frontMatter)) {
        return $this;
    }

    $source = $this->readSourceFile();

    $parts = preg_split('/[\n]*[-]{3}[\n]/', $source, 2);
    if (count($parts) === 2) {
        $this->frontMatter = Yaml::load($parts[0]);
        $this->template = trim($parts[1]);
    } else {
        $this->frontMatter = null;
        $this->template = trim($source);
    }

    return $this;
}

Ответы [ 3 ]

5 голосов
/ 15 августа 2011

Я думаю, что ваша проблема в том, что вы пытаетесь разделить что-то с тремя частями на две части. Если вы уроните третий аргумент в preg_split, вы получите массив с тремя элементами. Первая часть этого (когда разделена ---):

---
title = A nice title goes here
tags = tag1 tag2 tag3
---
This is the content of this entry...
Line2
Line3

Пусто, второе - это YAML, а третье - это содержимое. Попробуйте это:

$parts = preg_split('/[\n]*[-]{3}[\n]/', $source, 3);

И живой тестовый кейс: http://ideone.com/LYLxZ

Если вы хотите соответствовать тому, что, по-видимому, делает Phrozn, то ваш ввод будет выглядеть следующим образом:

title = A nice title goes here
tags = tag1 tag2 tag3
---
This is the content of this entry...
Line2
Line3

И ваш PHP будет таким:

$parts = preg_split('/[\n]*[-]{3}[\n]/', $source, 2);

И тестовый пример для этой версии: http://ideone.com/a9a6C

1 голос
/ 25 января 2014

Я столкнулся с той же проблемой и был совершенно недоволен непроверенным регулярным выражением и доступными редкими пакетами.

Я написал библиотеку (Composer, TDD, PSR-4), чтобы справиться с этим.Библиотека также обрабатывает синтаксический анализ YAML и уценки: FrontYAML

Парсер YAML и Markdown могут быть переопределены.По умолчанию используются Symfony YAML и Parsedown.

0 голосов
/ 12 ноября 2011

Я сделал это таким образом:

// $string contains the full file.

$split = preg_split("/[\n]*[-]{3}[\n]/", $string, 3, PREG_SPLIT_NO_EMPTY);
try {
  // Strip extra, non-indentation, whitespace from beginning of lines
  $i = 0; $yfm = "";
  while ($split[0][$i] == " ") {$i++;}
  foreach(preg_split("/((\r?\n)|(\r\n?))/", $split[0]) as $line){
    $yfm .= substr($line, $i) . "\n";
  }
  // Using symfony's YAML parser
  $data = sfYaml::load($yfm);
} catch(InvalidArgumentException $e) {
  // This is not YAML
}

Он удаляет посторонние отступы, которые могут быть получены, что может привести к отключению синтаксического анализатора, и преобразует все новые строки, будь то Win (CRLF), Nix (LF),или Mac (CR), до "\n".

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