开发者

Improve my code : Distributing the content of a textarea in two different arrays depending on markers

I have a textarea where the user can create a feature list with a title for each block of features. The idea is to store the [title] and the features in two different MySQL tables.

[Outdoor]

BBQ

Tennis court

Swimming pool

[Internal Equipment]

DVD Player

Plasma screen

Here is what I've done so far; it works but it's not neat:

<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>开发者_如何学C
<?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);
}
?>

Thanks for your ideas.


Other than that, make sure to use the POST method instead in your form. The query string vars can easily be tampered with.


Is this neat enough for you?

$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;
}

And the output:

echo '<pre>';
print_r($result);
echo '</pre>';

Array
(
    [Outdoor] => Array
        (
            [0] => BBQ
            [1] => Tennis court
            [2] => Swimming pool
        )

    [Internal Equipment] => Array
        (
            [0] => DVD Player
            [1] => Plasma screen
        )

)

I suppose you know what to do with the $result array? Something like:

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

    foreach ($features as $feature)
    {
        // or INSERT INTO bar (title, features) VALUES ($title, $feature);
    }
}


The code looks fine, for the most part.

The issue I see is that you're not sanitizing user input, rather you're displaying it directly:

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

At the very least, use strip_tags():

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

Also, you should probably use POST instead of GET.

Edit:

Another thing that I noticed is inconsistent use of braces. Either use the K&R style:

if (some_condition) {
    code
}

Or put them on a separate line (my preferred approach):

if (some_condition)
{
    code
}

(Does anyone know if there is a name for this style?)

Same thing for indentation. Keep it consistent. This is just a style issue, but it impacts the legibility of your code.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜