Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Нужна помощь с регулярнымы выражениями!
Форумы портала PHP.SU » PHP » Программирование на PHP » Нужна помощь с регулярнымы выражениями!

Страниц (2): [1] 2 »
 

1. Andruxa - 08 Февраля, 2011 - 22:07:50 - перейти к сообщению
Итак задача.
Есть url: http://suncity[dot]combats[dot]com/inf[dot]p[dot][dot][dot]_Elf&short=1
Задача разобрать всю информацию по этой ссылке в нужном мне виде.

По детски я делал так Улыбка
PHP:
скопировать код в буфер обмена
  1. $url="http://suncity.combats.com/inf.pl?login=".$_POST['login']."&short=1";
  2. $arr=file_get_contents($url);
  3. //далее разбиваю построчно:
  4. $arr1=explode("\n", $arr);
  5. foreach($arr1 as $key=>$value){ // это для себя для наглядности
  6. echo $key."=>".$value."<br>"; // $key вывожу для себя

Отображается в следующем виде:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 0=>login=MAG_Elf
  2. 1=>login_online=1
  3. 2=>id=1147855434
  4. 3=>align=0
  5. 4=>zodiac=8
  6. 5=>img=25
  7. 6=>gamecity=Suncity


написал маленкую функцию:
PHP:
скопировать код в буфер обмена
  1. function splits($arr){
  2.     $raz=explode("=", $arr);
  3.     echo"<b>".$raz[1]."</b>";
  4.     }
  5. //И вывожу нужный мне параметр так:
  6. echo splits($arr1[0]);


Все бы ничего, но тут такой момент, если игрок зашел то у него в массиве появляется элемент login_online=1, если он офф. то этого элемента нет. А если он еще и в бою, то появляется еще один элемент battle_id=1297194310.09728 т.е в разных случаях массив имеет разное количество значений и мой способ вывода параметров будет некорректный.
Поэтому мне кажется что тут лучше применить регулярные выражения, но так как с ними пока не дружу совсем Улыбка решил обратиться к Вам за помощью. Или посоветуйте в каком направлении мне дальше действовать.
2. OrmaJever - 08 Февраля, 2011 - 22:18:37 - перейти к сообщению
Andruxa пишет:
и мой способ вывода параметров будет некорректный.

почему?
PHP:
скопировать код в буфер обмена
  1. function splits($arr){
  2.     foreach($arr as $v)
  3.     {
  4.       list($key, $val) = explode("=", $v);
  5.       $array[$key] = $val;
  6.     }
  7.     return $array;
  8.     }

и вернёт асоциативный масив.
3. Andruxa - 08 Февраля, 2011 - 22:29:01 - перейти к сообщению
Если я загружаю по этой ссылке информацию персонажа который в двнный момент находится в статусе офф. , то да своим примером я все загружу что мне надо.
Т.е например вывожу параметр силы echo splits($arr1[9]); (который например будет=3)
А если я считываю когда персонаж в статусе онлайн, то $arr1[9] уже будет равен не параметру силы, а статусу онлайн ( а сила в этом случае =$arr1[10]) . Т.е при заходе в онлайн, массив сдвигается на +1, а если персонаж еще и в бою, то еще на +1.
4. OrmaJever - 08 Февраля, 2011 - 22:50:38 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $x = splits($arr);
  2. echo $x['str']; // или другой индекс
5. Andruxa - 08 Февраля, 2011 - 23:12:17 - перейти к сообщению
OrmaJever Огромаднейшее спасибо!!! Все работает так как надо!!!
Но работает с $arr1, т.е

Если не трудно распишите словами подробнее эту функцию:
PHP:
скопировать код в буфер обмена
  1. function splits($arr){
  2.     foreach($arr as $v)
  3.     {
  4.       list($key, $val) = explode("=", $v);
  5.       $array[$key] = $val;
  6.     }
  7.     return $array;
  8.     }
  9. // и вот это
  10. $x = splits($arr);
  11. echo $x['str'];
6. Andruxa - 09 Февраля, 2011 - 19:44:08 - перейти к сообщению
Разбираю дальше...
в $x['reputations'] находится следующее:
CODE (htmlphp):
скопировать код в буфер обмена
  1. title:Angels city,dsc:Рыцарь первого круга,img:misc/zn2_1.gif|title:Demons city,dsc:Рыцарь первого круга,img:misc/zn3_1.gif|title:Mooncity,dsc:Рыцарь первого круга,img:misc/zn9_1.gif|title:Sandcity,dsc:Рыцарь первого круга,img:misc/zn7_1.gif|title:Suncity,dsc:Рыцарь первого круга,img:misc/zn5_1.gif|title:Храм Знаний,dsc:Посвященный первого круга,img:misc/znrune_1.gif|

Мне нужно вытащить отсюда имена картинок.
PHP:
скопировать код в буфер обмена
  1. $dd= explode("|",$x['reputations']);    
  2.     foreach($dd as $key=>$value){
  3.         echo $key."=>".$value."<br>";
  4.     }

Вот тут засада, появляется какой то лишний элемент:
CODE (htmlphp):
скопировать код в буфер обмена
  1. 0=>title:Angels city,dsc:Рыцарь первого круга,img:misc/zn2_1.gif
  2. 1=>title:Demons city,dsc:Рыцарь первого круга,img:misc/zn3_1.gif
  3. 2=>title:Mooncity,dsc:Рыцарь первого круга,img:misc/zn9_1.gif
  4. 3=>title:Sandcity,dsc:Рыцарь первого круга,img:misc/zn7_1.gif
  5. 4=>title:Suncity,dsc:Рыцарь первого круга,img:misc/zn5_1.gif
  6. 5=>title:Храм Знаний,dsc:Посвященный первого круга,img:misc/znrune_1.gif
  7. 6=>

Как избавится от пустого элемента №6 ? Можно ли простым unset это решить ?
7. OrmaJever - 09 Февраля, 2011 - 20:15:43 - перейти к сообщению
array_pop()
8. Andruxa - 09 Февраля, 2011 - 21:12:27 - перейти к сообщению
OrmaJever Спасибо за подсказку, все получилось Улыбка

А теперь самое страшное для меня.
Теперь мне нужно разобрать то во что одет персонаж, т.е вот отсюда:
Цитата:
0=>login=MAG_Elf
1=>login_online=1
2=>id=1147855434
3=>align=0
4=>zodiac=8
5=>img=25
6=>gamecity=Suncity
.....и т.д. ......

27=>objects=clips1024=Серьги Стального Ящера\nУровень жизни: +105\nДолговечность: 32/34,amulet1024=Амулет Стального Ящера\nУровень жизни: +142\nДолговечность: 32/34,sword1024=Меч вечного путешественника\nУдар: 12 - 36\nУровень жизни: +63\nДолговечность: 17/19,body1024=Броня Стального Ящера\nУровень жизни: +209\nБроня корпуса: 19-72 (18+d54)\nДолговечность: 32/47,belt10210=Отменный пояс беспощадного предка\nУровень жизни: +106\nБроня пояса: 9-32 (8+d24)\nДолговечность: 10/18,ring1024=Кольцо Стального Ящера\nУровень жизни: +58\nДолговечность: 29/34,ring1024=Кольцо Стального Ящера\nУровень жизни: +58\nДолговечность: 32/34,ring1024=Кольцо Стального Ящера\nУровень жизни: +58\nДолговечность: 20/34,head1024=Шлем Стального Ящера\nУровень жизни: +107\nБроня головы: 15-57 (14+d43)\nДолговечность: 31/47,sword1051=Sword of Suppression\nУдар: 12 - 36\nДолговечность: 51/67,hands1043=Перчатки Быстрой Расплаты\nУровень жизни: +100\nДолговечность: 31/43,boots1043=Сапоги Быстрой Расплаты\nУровень жизни: +55\nБроня ног: 8-27 (7+d20)\nДолговечность: 46/64,arms10210=Надежные наручи неистового предателя\nУровень жизни: +126\nДолговечность: 10/18,legs1024=Поножи Стального Ящера\nУровень жизни: +103\nБроня пояса: 9-32 (8+d24)\nБроня ног: 7-25 (6+d19)\nДолговечность: 34/54

А именно то, что выделил жирным. То что выделил - это имена картинок, вот их мне нужно вытащить. Методом которым я все вытаскивал выше не получается, если честно вообще нет никаких мыслей, нужна помощь! Тут наверное точно без регулярных выражений никак.
9. OrmaJever - 09 Февраля, 2011 - 21:51:31 - перейти к сообщению
Смело могли создавать тему в разделе "Напишите за меня" Подмигивание
Некоторые задачи легче чем кажутся! главное найти закономерность Улыбка
PHP:
скопировать код в буфер обмена
  1. $str = "27=>objects=clips1024=Серьги Стального Ящера\nУровень жизни: +105\nДолговечность: 32/34,amulet1024=Амулет Стального Ящера\nУровень жизни: +142\nДолговечность: 32/34,sword1024=Меч вечного путешественника\nУдар: 12 - 36\nУровень жизни: +63\nДолговечность: 17/19,body1024=Броня Стального Ящера\nУровень жизни: +209\nБроня корпуса: 19-72 (18+d54)\nДолговечность: 32/47,belt10210=Отменный пояс беспощадного предка\nУровень жизни: +106\nБроня пояса: 9-32 (8+d24)\nДолговечность: 10/18,ring1024=Кольцо Стального Ящера\nУровень жизни: +58\nДолговечность: 29/34,ring1024=Кольцо Стального Ящера\nУровень жизни: +58\nДолговечность: 32/34,ring1024=Кольцо Стального Ящера\nУровень жизни: +58\nДолговечность: 20/34,head1024=Шлем Стального Ящера\nУровень жизни: +107\nБроня головы: 15-57 (14+d43)\nДолговечность: 31/47,sword1051=Sword of Suppression\nУдар: 12 - 36\nДолговечность: 51/67,hands1043=Перчатки Быстрой Расплаты\nУровень жизни: +100\nДолговечность: 31/43,boots1043=Сапоги Быстрой Расплаты\nУровень жизни: +55\nБроня ног: 8-27 (7+d20)\nДолговечность: 46/64,arms10210=Надежные наручи неистового предателя\nУровень жизни: +126\nДолговечность: 10/18,legs1024=Поножи Стального Ящера\nУровень жизни: +103\nБроня пояса: 9-32 (8+d24)\nБроня ног: 7-25 (6+d19)\nДолговечность: 34/54";
  2. preg_match_all('#\d+/\d+,(.+?)=#ism', $str, $r);
  3. print_r($r[1]);
10. Andruxa - 09 Февраля, 2011 - 22:14:52 - перейти к сообщению
OrmaJever еще раз спасибо, вроде все ищет что надо Улыбка
Цитата:
Некоторые задачи легче чем кажутся! главное найти закономерность
Это точно, иногда такое напридумаю, что самому страшно становится, а когда подскажут то решение как всегда простое оказывается Улыбка. Я пока не научился мыслить как программист, я только учусь Улыбка
11. JustUserR - 10 Февраля, 2011 - 15:37:24 - перейти к сообщению
Andruxa пишет:
А когда подскажут то решение как всегда простое оказывается
В общем случае указанное решения для предполагаемой задачи является корректным но не осуществляет включение проверки уровня трактования полученных информационных полей относительно кодовой таблицы - дело в том что при осуществлении переноса указанного PHP-приложения на новый web-сервер не всегда возможно обеспечения его корректной работы - по причине отсутствия рассмотрения парамета загружаемого HTTP-документа на предмет включенного значения соответствующей кодовой таблицы
12. Andruxa - 13 Февраля, 2011 - 18:23:22 - перейти к сообщению
Подскажите, что не так?


PHP:
скопировать код в буфер обмена
  1. $url="http://suncity.combats.com/inf.pl?login=".$_POST['login']."&short=1";
  2. $arr=file_get_contents($url);
  3. //echo $arr; // Этот массив полон.
  4.  
  5. preg_match("#log(.*?)reputations#si",$arr, $test);
  6. echo $test[1];// Почему он иногда бывает пуст ???


Ищу в этом куске:
Цитата:
login=MAG_Elf login_online=1 id=1147855434 align=0 zodiac=8 img=25 gamecity=Suncity gamecity_url=http://suncity[dot]combats[dot]com room_name=Зал воинов 3 level=10 vicrory=18136 defeat=4623 withdraw=77 name=Elf sex=0 dex=3 str=20 inst=145 power=58 _dex=3 _str=20 _inst=97 _power=58 birthplace=Sandcity date_registry=17.05.06 19:43 pet_type=owl pet_level=6 pet_name=Валькирия reputations=


Вопрос такой, почему когда я подставляю разные логины, то массив $test[1] иногда бывает пуст, а иногда все нормально работает ?
Есть ли какие то ограничения использования рег. выражений в одном скрипте ?
13. JustUserR - 14 Февраля, 2011 - 13:24:29 - перейти к сообщению
Andruxa пишет:
Вопрос такой, почему когда я подставляю разные логины, то массив $test[1] иногда бывает пуст, а иногда все нормально работает ?
Возможной причиной осуществления нестабильной работы предполагаемого PHP-приложения является использование в качестве средства базы данных не обесчивающих разделение уровня трактования информационных полей и управляющих объектов - таким образом в процессе выполнения сопоставления регулярного выражения возможно выделение элементов в некорректных позициях в силу неоднородности анализируемого содержимого
14. Andruxa - 24 Февраля, 2011 - 16:34:21 - перейти к сообщению
Подскажите что не так.
Вывод нескольких персонажей с информацией:
PHP:
скопировать код в буфер обмена
  1. echo"<table  border=1 width=70%>";
  2. $array_login=array("MAG_Elf", "Сэнсей", "Sony Bono", "Dylin");
  3. foreach($array_login as $value){    
  4. $login=str_replace(" ", "%20",$value);  
  5. $url="http://suncity.combats.com/inf.pl?login=".$login."&short=1";
  6. $infa=file_get_contents($url);
  7. $inf=explode("\n", $infa);
  8. foreach($inf as $vv){
  9.     list($x,$y)=explode("=",$vv);
  10.     $info[$x]=$y;
  11. }
  12. //var_dump($info);
  13. echo"<tr>
  14. <td>".$info['login']."</td>
  15. <td>".$info['login_online']."</td>
  16. <tr>";
  17. }
  18. echo"</table>";


в стр. под №15 я хочу вывести состояние пользователя (online/offline), но тут какая то абракадабра получается, если первый персонаж ( в данном случае MAG_Elf) в сети, то почему то и всем остальным присвоивается такоеже значение, т.е info['login_online']=1, хотя на самом деле он только один в сети.
Не могу понять почему это происходит ?
15. Okula - 24 Февраля, 2011 - 17:57:12 - перейти к сообщению
Andruxa, для начала вот это убери

И поставь это
PHP:
скопировать код в буфер обмена
  1. $login = urlencode($value);


Мне кажется у тебя многовато вложенных циклов. Думаю можно реализовать это куда лучше, правда голова плохо сейчас варит. Улыбка

 

Powered by ExBB FM 1.0 RC1