Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > собрать массив из строки через regex


Автор: Elfet 27.1.2005, 19:37
Вот есть строка : page=www/home/news.,show=no,hi,bar=vremy dengi,link=yes,
Нужно получить массив:

$m['page'][0] => 'www',
$m['page'][1] => 'home',
$m['page'][2] => 'new',

$m['show'] => 'no',

$m['hi'] => 'null',

$m['bar'] => 'vremy dengi',

$m['link'] => 'yes',


и page - всегда первый параметр, и заканчивается всегда на точку - page=[что-то].

вот, пытался сам не выходит smile потом написал без regex, но получилось глючное уродство smile
прошу помощь! smile

Автор: Alx 27.1.2005, 19:47
хмм, интересно, щас посижу))
Добавлено @ 19:48
только можно без RegEX? он мне не очень нарвится

Автор: Irokez 27.1.2005, 19:51
Код

<?php
$str='page=www/home/news.,show=no,hi,bar=vremy dengi,link=yes,';
$pattern='/([\w]+)(=([^,]*))?/';
preg_match_all($pattern, $str, $m, PREG_SET_ORDER);
echo "<pre>";
print_r($m);
echo "</pre>";
?>

Автор: Elfet 27.1.2005, 20:06
Irokez, вот что у тебя выдаёт:
Код

Array
(
   [0] => Array
       (
           [0] => page=www/home/news.
           [1] => page
           [2] => =www/home/news.
           [3] => www/home/news.
       )

   [1] => Array
       (
           [0] => show=no
           [1] => show
           [2] => =no
           [3] => no
       )

   [2] => Array
       (
           [0] => hi
           [1] => hi
       )

   [3] => Array
       (
           [0] => bar=vremy dengi
           [1] => bar
           [2] => =vremy dengi
           [3] => vremy dengi
       )

   [4] => Array
       (
           [0] => link=yes
           [1] => link
           [2] => =yes
           [3] => yes
       )

)




здорово, но несовсем то! smile

Автор: Alx 27.1.2005, 20:17
Код

<?
$m = array();
$str = "page=www/home/news.,show=no,hi,bar=vremy dengi,link=yes";
$mas = explode(",", $str);
for ($i=0;$i<count($mas);$i++)
{$lmas = explode("=", $mas[$i]);
for ($k=0;$k<count($lmas);$k+=2)
{$m[$lmas[$k]] = $lmas[$k+1];
if ($lmas[$k+1] == "")
{$m[$lmas[$k]] = "null";
}
}
}
// ... всякие извращения, которые делал человек, не умеющий печатать массив вида "ключ" => "значение"!
$keys = array_keys($m);
for ($f=0;$f<count($m);$f++)
{echo "&quot;{$keys[$f]}&quot; => &quot;{$m[$keys[$f]]}&quot;<br>";
}
?>

Автор: Irokez 27.1.2005, 21:07
Цитата

здорово, но несовсем то! smile

Elfet да вообще-то то, только надо было мой код просто довести до конечного результата,
как можно заметить, в элементах массива $m[n][1] записывается имя параметра, а в $m[n][3] - его значение, n тут меняется от 0 и до бесконечности ... вот и все =) тебе осталось только циклом записать результат, ну и еще одним регекспом разбить значения содержащие '/' на массив (к примеру - www/home/news), но я думаю тут ты уже справишься сам ...

Автор: Elfet 27.1.2005, 22:22
ок! всем спасибо! smile

Автор: Elfet 27.1.2005, 23:42
Код

     function get_about($de)
     {
       $loadsite=array();

       $loadpath=explode(",",$de);
       foreach($loadpath as $k=>$v)
       {
        $loadin=explode("=",$v );
        $loadsite[$loadin[0]]=$loadin[1];
       }

       $site=array(
       'path' => explode("/", str_replace(".", "", ($loadsite['page']?$loadsite['page']:"") )  ),
       'class' => $loadsite['class']?$loadsite['class']:"txt",
       'showinmenu' => $loadsite['showinmenu']?$loadsite['showinmenu']:"yes",
       'showtop' => $loadsite['showtop']?$loadsite['showtop']:"yes",
       );

     return $site;
    }

print_r ( get_about("page=h/www/into.,class=txt"));

Автор: Alx 28.1.2005, 16:29
жаль, что ты уже нашёл ршение, я старался((

ну да ладно, всё к лучшему. надо сказать, что больше всего времени я потратил не на запись массива, а на его вывод(( вот я что у меня получилось:

Код

<?
$m = array();
$str = "page=www/home/news.,show=no,hi,bar=vremy dengi,link=yes";
$mas = explode(",", $str);
for ($i=0;$i<count($mas);$i++)
{$lmas = explode("=", $mas[$i]);
for ($k=0;$k<count($lmas);$k+=2)
{$m[$lmas[$k]] = $lmas[$k+1];
if (strrpos($lmas[$k+1], "/"))
{$llmas = explode("/", $lmas[$k+1]);
$m[$lmas[$k]] = "";
$m[$lmas[$k]] = array();
for ($n=0;$n<count($llmas);$n++)
{$m[$lmas[$k]][$n] = $llmas[$n].".";
}
}
if ($lmas[$k+1] == "")
{$m[$lmas[$k]] = "null";
}
}
}
// ... всякие извращения, которые делал человек, не умеющий печатать массив вида "ключ" => "значение"!
$keys = array_keys($m);
for ($f=0;$f<count($m);$f++)
{if (is_array($m[$keys[$f]]))
{for($l=0;$l<count($m[$keys[$f]]);$l++)
echo "\$m[{$keys[$f]}][{$l}] => &quot;{$m[$keys[$f]][$l]}&quot;<br>";
}
else
echo "\$m[{$keys[$f]}] => &quot;{$m[$keys[$f]]}&quot;<br>";
}
?>

Автор: Elfet 30.1.2005, 20:44
всё равно спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)