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即可。更简单、更高性能听起来不像是一个非常有趣的电视节目。你不需要正则表达式。当然,可以用正则表达式在更少的行中完成,但是正则表达式要慢得多,所以像这样的简单任务应该用字符串函数来完成。