2012-03-15 2 views
0

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

[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) 
      ) 
     ); 
    } 
} 

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

+1

Да, используйте базу данных :) SQLite может быть –

+0

'$ text' поступает из базы данных; вот как он хранится. Как мне улучшить это? Возможно, я должен сериализовать предмет перед его хранением? –

+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

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']; 
    } 
} 
Смежные вопросы