preg_match_all

hsasha

Новичок
preg_match_all

Здравствуйте!
Есть xml файл,вот кусок для примера:
PHP:
<state>
<name>Alabama</name>
<service>
<name>1</name>
<all>1004352</all>
<send>93776</send>
<left>877766</left>
</service>
</state>
<state>
<name>Florida</name>
<service>
<name>1</name>
<all>352</all>
<send>976</send>
<left>7766</left>
</service>
</state>
Нужно вырезать так:
Alabama: all-1004352;send-93776;left-877766;
Florida:all-352;send-976;left-7766;
Начал делать так:
PHP:
preg_match_all('|<state>(.*)</state>|Uis',$out_states[1][0],$out_state);
for($i=0;$i<count($out_state[1]);$i++){
preg_match_all('|<name>(.*)</name>|Uis',$out_state[1][$i],$out_name);
$out_name[1][0]; //Это вышли Alabama и Florida

}
А дальше застрял, т.к. надо чтобы соответствовало all;send;left; городам
Заранее спасибо.
 

AmdY

Пью пиво
Команда форума
тебе нужно обязательно регуляркой парсить xml?
 

Optim

Новичок
$subject = <<<STR
<state>
<name>Alabama</name>
<service>
<name>1</name>
<all>1004352</all>
<send>93776</send>
<left>877766</left>
</service>
</state>
<state>
<name>Florida</name>
<service>
<name>1</name>
<all>352</all>
<send>976</send>
<left>7766</left>
</service>
</state>
STR;

$pattern = "/<state>.*?<name>(.*?)<\/name>.*?<all>(.*?)<\/all>.*?<send>(.*?)<\/send>.*?<left>(.*?)<\/left>.*?<\/state>/si";
preg_match_all($pattern, $subject, $out);

$count = count($out[0]);

for ($i = 0 ; $i < $count; $i++) {
echo $out[1][$i].': all-'.$out[2][$i].';send-'.$out[3][$i].';left-'.$out[4][$i].';<br/>';
}

SAX конечно удобней - но если надо сделать только раз - и переделываться не будет долго (или вообще не будет) - то лучше наверно регуляркой - должно работать быстрей :) и написать не так то и сложно :)
 

hsasha

Новичок
Спасибо!
А если файл содержит такое как пробежатся по всем тегам с помощью регулярки?

<friends>
<friend>
<name>DUL-AllStates-W4</name>

<state>
<name>Ohio</name>
<find>468281</find>
<find2>440472</find2>
<find3>469513</find3>
<all>500206</all>
</state>

<state>
<name>Oklahoma</name>
<find>108489</find>
<find2>85725</find2>
<find3>113519</find3>
<all>130563</all>
</state>

<state>
<name>Oregon</name>
<find>169628</find>
<find2>149860</find2>
<find3>176822</find3>
<all>193489</all>
</state>

<state>
<name>Pennsylvania</name>
<find>551024</find>
<find2>527623</find2>
<find3>555162</find3>
<all>585453</all>
</state>

<state>
</friend>
<friend>
<name>DUL-AllStates-W4</name>

<state>
<name>Ohio</name>
<find>468281</find>
<find2>440472</find2>
<find3>469513</find3>
<all>500206</all>
</state>

<state>
<name>Oklahoma</name>
<find>108489</find>
<find2>85725</find2>
<find3>113519</find3>
<all>130563</all>
</state>

<state>
<name>Oregon</name>
<find>169628</find>
<find2>149860</find2>
<find3>176822</find3>
<all>193489</all>
</state>

<state>
<name>Pennsylvania</name>
<find>551024</find>
<find2>527623</find2>
<find3>555162</find3>
<all>585453</all>
</state>

<state>
</friend>
</friends>

У меня не выходит, и собирает только теги по первым вхождением:(<friend> <friend>
 

alexs

Новичок
тебе уже всё разжевали:
смотреть сюда: simplexml, sax, dom, regexp

готовое решение в этом форуме за тебя писать не будут
 

hsasha

Новичок
Ок!
Тогда прошу помочь
пишу
PHP:
$xml = simplexml_load_file('full_stat.xml');

foreach ($xml->state as $state) {
   echo $state->name, '<br>';
}
А оно мне пустую строку

Вот кусоr xml в print_R
Код:
SimpleXMLElement Object
(
    [states] => SimpleXMLElement Object
        (
            [state] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [name] => SimpleXMLElement Object
                                (
                                )

                            [service] => Array
                                (
                                    [0] => SimpleXMLElement Object
                                        (
                                            [name] => SimpleXMLElement Object
                                                (
                                                )

                                            [all] => 1004352
                                            [send] => 93776
                                            [left] => 877766
                                        )

                                    [1] => SimpleXMLElement Object
                                        (
                                            [name] => SimpleXMLElement Object
                                                (
                                                )

                                            [all] => 12724
                                            [send] => 0
                                            [left] => 12589
                                        )

                                )

                        )

                    [1] => SimpleXMLElement Object
                        (
                            [name] => SimpleXMLElement Object
                                (
                                )

                            [service] => Array
                                (
                                    [0] => SimpleXMLElement Object
                                        (
                                            [name] => SimpleXMLElement Object
                                                (
                                                )

                                            [all] => 168496
                                            [send] => 0
                                            [left] => 168496
                                        )

                                    [1] => SimpleXMLElement Object
                                        (
                                            [name] => SimpleXMLElement Object
                                                (
                                                )

                                            [all] => 2454
                                            [send] => 0
                                            [left] => 2454
                                        )

                                )

                        )
З.Ы. php 5
 

Фанат

oncle terrible
Команда форума
ну и где в этой структуре написано, что в $state есть элемент name?
 

hsasha

Новичок
ТОчно ,не туда посмотрел,
$xml = simplexml_load_file('full_stat.xml');

foreach ($xml->states->state as $state) {
echo $state->name, '<br>';
}
:))

-~{}~ 06.04.07 18:23:

Вот написал рабочий скрипт, но мне нужны массивы, а вылазят "SimpleXMLElement Object()".Как перегнать эти объекты в массивы?
PHP:
$xml = simplexml_load_file('full_stat.xml');
  $ar=array();
foreach($xml->friends->friend as $friends){
for ($i=0;$i<count($friends->state);$i++) {
$ar=$friends->state[$i]->name;
  $datay1=$friends->state[$i]->find;
  $datay2=$friends->state[$i]->find2;
   $datay3=$friends->state[$i]->find3;
  $datay4=$friends->state[$i]->all;
 
Сверху