将数据解析为数组

时间:2012-03-15 18:51:36

标签: php parsing

我正在为我喜欢的电视节目创建一个“引用数据库”,而我正在重写其中的部分内容,我并不特别喜欢。我遇到了我的函数,将包含引号和字符的数据解析成一个我可以轻松遍历并显示的数组。该网站的一个功能是,您可以使用单引号(单行)或多个字符之间的对话。现在我正在存储这样的单引号:

  

[charactername]这是我诙谐的单行。

会话遵循相同的模式:

  

[characternameone]天气怎么样?

     

[characternametwo]相当不错,实际上。

等等。这是前面提到的解析函数:

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 个答案:

答案 0 :(得分:1)

就个人而言,我会更改您的数据存储方法。处理序列化或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'];
  }
}

答案 1 :(得分:0)

而不是

        $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