Php 将数据解析为数组

Php 将数据解析为数组,php,parsing,Php,Parsing,我正在为一个我很喜欢的电视节目创建一个“报价数据库”,我正在重写我不太喜欢的部分内容。我遇到了一个函数,它将包含引号和字符的数据解析为一个数组,我可以轻松地循环并显示该数组。该网站的一个特点是,你可以有一个单引号(一行)或几个字符之间的对话。现在我存储的单引号如下: [角色名称]这是我诙谐的一句台词 对话遵循同样的模式: 天气怎么样 实际上相当不错 等等。下面是前面提到的解析函数: function parse_quote($text) { // Determine if it's a

我正在为一个我很喜欢的电视节目创建一个“报价数据库”,我正在重写我不太喜欢的部分内容。我遇到了一个函数,它将包含引号和字符的数据解析为一个数组,我可以轻松地循环并显示该数组。该网站的一个特点是,你可以有一个单引号(一行)或几个字符之间的对话。现在我存储的单引号如下:

[角色名称]这是我诙谐的一句台词

对话遵循同样的模式:

天气怎么样

实际上相当不错

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

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)
            )
        );
    }
}
它如预期的那样工作,但我忍不住认为有更好的方法来做到这一点。我对正则表达式很反感,我想在这种情况下,正则表达式至少会有些用处。有什么建议或改进吗?

而不是

        $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

就我个人而言,我会改变你的数据存储方法。处理序列化或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'];
  }
}
功能显示\u报价($input)
{
对于($i=0,$n=count($input);$i0)echo“\n”;
echo$quote['name'].:'.$quote['quote'];
}
}

是的,使用数据库:)SQLite可能
$text
来自数据库;这就是它的存储方式。我该如何改进?也许我应该在存储它之前序列化它?好吧,你没有提到,所以我猜“平面文件”就是这样的意思。进步?使用列(在与引号关联的表中)作为字符名,这样就不必解析任何内容,只需在正确索引的列上使用select即可。更简单、更高性能听起来不像是一个非常有趣的电视节目。你不需要正则表达式。当然,可以用正则表达式在更少的行中完成,但是正则表达式要慢得多,所以像这样的简单任务应该用字符串函数来完成。