Улучшение моего кода: распределение содержимого текстовой области в двух разных массивах в зависимости от маркеров - PullRequest
2 голосов
/ 14 июля 2010

У меня есть текстовое поле, где пользователь может создать список функций с заголовком для каждого блока функций. Идея состоит в том, чтобы хранить [title] и функции в двух разных таблицах MySQL.

[Открытый]
BBQ
Теннисный корт
Бассейн

[Внутреннее оборудование]
DVD-плеер
Плазменный экран

Вот что я сделал до сих пор; это работает, но это не аккуратно:

<form name="form" method="get" action="">
  <p>
    <textarea name="content" cols="35" rows="12" id="content"><? 
if (isset($_GET['content'])) echo $_GET['content']; ?></textarea>
  </p>
  <p>
    <input name="parse" type="submit" id="parse" value="Parse">
  </p>
</form>
<?php

if(isset($_GET['parse']))
{
   $content = $_GET['content'];
   $content = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $content);
   $content = trim($content);

   $content1 = preg_replace('/\r\n|\r/', "\n", $content );  
    $data = explode("\n", $content1); 


    $p=0;
   foreach ($data as $title) {
   if (substr_count($title, '[')||substr_count($title, ']')){
  $p++;
   $arr[$p]=$title;

   }else {
   $g[$p][]=$title;
   }
   }

    print_r($arr); 
    echo '<br />';
    print_r($g);
}
?>

Спасибо за ваши идеи.

Ответы [ 3 ]

1 голос
/ 14 июля 2010

Кроме этого, убедитесь, что вместо этого в своей форме используется метод POST.Строки запроса могут быть легко изменены.

0 голосов
/ 14 июля 2010

Достаточно ли вам этого аккуратного ?

$result = array();
$content = array_filter(array_map('trim', explode('[', $_GET['content'])), 'strlen');

foreach ($content as $value)
{
    $value = array_map('trim', explode("\n", $value));
    $result[rtrim(array_shift($value), ']')] = $value;
}

А вывод:

<code>echo '<pre>';
print_r($result);
echo '
';Массив ([Открытый] => Массив ([0] => Барбекю [1] => Теннисный корт [2] => Бассейн) [Внутреннее оборудование] => Массив ([0] => DVD-плеер [1] =>Плазменный экран))

Полагаю, вы знаете, что делать с массивом $result?Что-то вроде:

foreach ($result as $title => $features)
{
    // INSERT INTO foo (title) VALUES ($title);

    foreach ($features as $feature)
    {
        // or INSERT INTO bar (title, features) VALUES ($title, $feature);
    }
}
0 голосов
/ 14 июля 2010

Код выглядит нормально, по большей части.

Проблема, которую я вижу, заключается в том, что вы не дезинфицируете пользовательский ввод, а отображаете его напрямую:

if (isset($_GET['content'])) echo $_GET['content']; 

Как минимум, используйте strip_tags ():

if (isset($_GET['content'])) echo strip_tags($_GET['content']));

Кроме того, вы, вероятно, должны использовать POST вместо GET.

Edit:

Еще одна вещь, которую я заметил, это непоследовательное использование скобок. Либо используйте стиль K & R:

if (some_condition) {
    code
}

Или поместите их на отдельной строке (мой предпочтительный подход):

if (some_condition)
{
    code
}

(Кто-нибудь знает, есть ли название для этого стиля?)

То же самое для отступа. Держите это последовательным. Это просто вопрос стиля, но он влияет на удобочитаемость вашего кода.

...