Разобрать данные в массив - PullRequest
0 голосов
/ 15 марта 2012

Я создаю «базу данных цитат» для телешоу, фанатом которого я являюсь, и переписываю части, которые мне не особенно нравятся. Я наткнулся на свою функцию для анализа данных, содержащих кавычки и символы, в массив, который я могу легко просмотреть и отобразить. Одной из особенностей сайта является то, что вы можете иметь одинарную цитату (однострочник) или разговор между несколькими персонажами. Прямо сейчас я храню одинарные кавычки так:

[имя_символа] Это моя остроумная строчка.

И разговоры идут по той же схеме:

[характерное имя] Как погода?

[Charactersametwo] Довольно хорошо, на самом деле.

И так далее. Вот вышеупомянутая функция разбора:

function parse_quote($text)
{
    // Determine if it's a single or convo
    if ( strpos($text, "\n") != false )
    {
        // Convo
        // Let's explode into the separate characters/lines
        $text = explode("\n", $text);
        $convo = array();

        // Parse each line into character and line
        foreach ( $text as $part )
        {
            $character = substr($part, 1, strpos($part, ']') - 1);
            $line = substr($part, strlen($character) + 2);
            $convo[] = array(
                'character' => $character,
                'line' => $line
            );
        }

        return array(
            'type' => 'convo',
            'quote' => $convo
        );
    }
    else
    {
        // Single
        // Parse line into character and line
        return array(
            'type' => 'single',
            'quote' => array(
                'character' => substr($text, 1, strpos($text, ']') - 1),
                'line' => substr($text, strlen(substr($text, 1, strpos($text, ']') - 1)) + 2)
            )
        );
    }
}

Это работает, как и ожидалось, но я не могу не думать, что есть лучший способ сделать это. Я ужасен с регулярными выражениями, которые, я полагаю, пригодятся в этой ситуации, по крайней мере, несколько удобно Любой совет или улучшения?

Ответы [ 2 ]

1 голос
/ 15 марта 2012

Лично я бы изменил ваш метод хранения данных.Было бы намного проще иметь дело с сериализованной или JSON-кодированной строкой.

Вместо

[characternameone]How's the weather?
[characternametwo]Pretty good, actually.

у вас будет

array(
  [0] => {
    'name'  => "characternameone",
    'quote' => "How's the weather?"
  },
  [1] => {
    'name'  => "characternametwo",
    'quote' => "Pretty good, actually"
  }
)

Затем, когда вы ее прочитаетенет разборов.

function display_quote($input)
{
  for ($i=0, $n=count($input); $i<$n; $i++) {
    $quote = $input[$i];
    if ( $i > 0 ) echo "\n";
    echo $quote['name'] . ': ' . $quote['quote'];
  }
}
0 голосов
/ 15 марта 2012

Вместо

        $character = substr($part, 1, strpos($part, ']') - 1);
        $line = substr($part, strlen($character) + 2);
        $convo[] = array(
            'character' => $character,
            'line' => $line
        );

вы можете попробовать

        preg_match('#\[([^\]]+)\](.*)#ism', $part, $match);
        $convo[] = array(
            'character' => $match[1],
            'line' => $match[2]
        );

HTH

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