我正在为我喜欢的电视节目创建一个“引用数据库”,而我正在重写其中的部分内容,我并不特别喜欢。我遇到了我的函数,将包含引号和字符的数据解析成一个我可以轻松遍历并显示的数组。该网站的一个功能是,您可以使用单引号(单行)或多个字符之间的对话。现在我正在存储这样的单引号:
[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)
)
);
}
}
它按预期工作,但我不禁想到有更好的方法来做到这一点。我对正则表达式很恐怖,我认为在这种情况下至少会有点方便。有什么建议或改进吗?
答案 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