[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярное выражение
ArtemKrass
Всем Доброго дня!

Есть такая строка кода:

ITowns.initialize({"groups":null,"towns":[{"id":80121,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-01","island_x":732,"island_y":694,"plenty":"wood","r are":"stone","has_conqueror":false,"researches":{"berth" :true,"conscription":true,"mathematics":true},"favor":500},{"id":78218,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-02","island_x":716,"island_y":708,"plenty":"iron","rare":"wood","has_conqueror":fal se,"researches":{"berth":true,"conscription":true,"mathematics&quo t;:true},"favor":500},{"id":57664,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-03","island_x":681,"island_y":706,"plenty":"stone","rare":"wood","has_conqueror":fa lse,"researches":{"berth":true,"conscription":true,"mathematics&qu ot;:true},"favor":500},{"id":46826,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-04","island_x":679,"island_y":703,"plenty":"iron","rare":"wood","has_conqueror":fal se,"researches":{"berth":true,"conscription":true,"mathematics&quo t;:true},"favor":500}.....


Из этой строки мне нужно выдернуть значения ID и NAME, перекодировать значение NAME в кириллицу и сохранить эти значения в переменные, для дальнейшего использования...

Не пойму как составить регулярку, потому что весь код огромный "id" и "name" встречается огромное количество раз, а мне нужно выдернуть значения именно из этой строчки...




Спустя 26 минут, 46 секунд (9.07.2012 - 19:47) pak написал(а):
\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-01
это кажется двухбайтовый юникод, где то я видел перевод, щас поищю

Спустя 5 минут, 30 секунд (9.07.2012 - 19:53) Игорь_Vasinsky написал(а):
file() - получил массив строк из файла

foreach() - перебор все элемент массива

substr_count() - поиск элемента массива, содержащего ITowns.initialize

запись этого элемента в переменную

json_decode() этой строки

потом перекодировать юникод (погугли - есть готовые функции)

Спустя 1 минута, 16 секунд (9.07.2012 - 19:54) ArtemKrass написал(а):
Просто перевести не проблема... Как это сделать посредством PHP?

Спустя 1 минута, 43 секунды (9.07.2012 - 19:56) pak написал(а):
вот нашол перевод:

$a = '\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-01';
//1 способ
echo preg_replace('#\\\\u([0-9a-f]{4})#se','iconv("UTF-16BE","UTF-8",pack("H4","$1"))',$a);
//2 способ
print_r( json_decode('["'.$a.'"]') );


Спустя 7 минут (9.07.2012 - 20:03) ArtemKrass написал(а):
Цитата (Игорь_Vasinsky @ 9.07.2012 - 16:53)
file() - получил массив строк из файла

foreach() - перебор все элемент массива

substr_count() - поиск элемента массива, содержащего ITowns.initialize

запись этого элемента в переменную

json_decode() этой строки

потом перекодировать юникод (погугли - есть готовые функции)

А при помощи preg_match_all() нельзя?

Спустя 2 минуты, 18 секунд (9.07.2012 - 20:05) Игорь_Vasinsky написал(а):
можешь, ест-но можешь - но это же json формат. дело твоё.

Спустя 8 минут, 18 секунд (9.07.2012 - 20:13) pak написал(а):
у меня так получилось:

$str = 'ITowns.initialize({"groups":null,"towns":[{"id":80121,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-01","island_x":732,"island_y":694,"plenty":"wood","r are":"stone","has_conqueror":false,"researches":{"berth" :true,"conscription":true,"mathematics":true},"favor":500},{"id":78218,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-02","island_x":716,"island_y":708,"plenty":"iron","rare":"wood","has_conqueror":fal se,"researches":{"berth":true,"conscription":true,"mathematics& ;quo t;:true},"favor":500},{"id":57664,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-03","island_x":681,"island_y":706,"plenty":"stone","rare":"wood","has_conqueror":fa lse,"researches":{"berth":true,"conscription":true,"mathematics&am p;qu ot;:true},"favor":500},{"id":46826,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440-04","island_x":679,"island_y":703,"plenty":"iron","rare":"wood","has_conqueror":fal se,"researches":{"berth":true,"conscription":true,"mathematics& ;quo t;:true},"favor":500}';
$m = explode(',', $str);
foreach($m as $v)
{
if($p = strpos($v, 'id'))
{
$id[] = substr($v,$p+4);
}
elseif($p = strpos($v, 'name'))
{
$name[] = substr($v,$p+6);
}
}


echo '<br><br><pre>';
print_r($id);
echo '<br><br>';
print_r($name);
echo '</pre>';

Спустя 9 минут, 11 секунд (9.07.2012 - 20:23) ArtemKrass написал(а):
Работает!
Но $str может меняться... Т.е. "Id" и "Name" могут добавляться или уменьшаться. Т.е. мне нужно парсить именно код страницы...

Не могу понять как мне во всем коде найти именно эту строку

Спустя 58 секунд (9.07.2012 - 20:24) Игорь_Vasinsky написал(а):
ITowns.initialize - только в этой строке в начале?

Спустя 41 минута, 42 секунды (9.07.2012 - 21:05) ArtemKrass написал(а):
Да

Спустя 2 минуты, 38 секунд (9.07.2012 - 21:08) Игорь_Vasinsky написал(а):
Цитата
substr_count() - поиск элемента массива, содержащего ITowns.initialize


Спустя 41 минута, 18 секунд (9.07.2012 - 21:49) ArtemKrass написал(а):
А как мне быть, если я страницу получаю при помощи Curl, т.е. ее содержимое оказывается в переменной...

foreach не работает в таком случае?

Спустя 15 минут, 46 секунд (9.07.2012 - 22:05) ArtemKrass написал(а):
Например:
function requester($url, $post = 0, $cookies = '', $head = 1, $body = 0)  
{
$cl = curl_init();
curl_setopt($cl, CURLOPT_URL, $url);
curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cl, CURLOPT_HEADER, $head);
curl_setopt($cl, CURLOPT_COOKIE, $cookies);
curl_setopt($cl, CURLOPT_NOBODY, $body);
if ($post){
curl_setopt($cl, CURLOPT_POST, 1);
curl_setopt($cl, CURLOPT_HTTPHEADER, array('X-REQUESTED-WITH: XMLHttpRequest')); //иммитируем AJAX запрос
curl_setopt($cl, CURLOPT_POSTFIELDS, $post);
}
$line = curl_exec($cl);
curl_close($cl);
return $line;
}


Получаю переменную с кодом страницы:
$stranica = requester('ссылка ссылка ссылка', 0, $cook, 1, 0);


как быть дальше?

Спустя 2 минуты (9.07.2012 - 22:07) Игорь_Vasinsky написал(а):
уф... ну регуляркой выдерни этот нужный кусок то.

Спустя 30 секунд (9.07.2012 - 22:08) Игорь_Vasinsky написал(а):
можешь за несколько этапов распарсивать.

Спустя 8 часов, 20 минут, 1 секунда (10.07.2012 - 06:28) pak написал(а):
Цитата (ArtemKrass @ 9.07.2012 - 17:23)
Работает!
Но $str может меняться... Т.е. "Id" и "Name" могут добавляться или уменьшаться. Т.е. мне нужно парсить именно код страницы...

Не могу понять как мне во всем коде найти именно эту строку

это не проблема, добавки и посмотрите снова.

Спустя 2 часа, 42 минуты, 53 секунды (10.07.2012 - 09:10) ArtemKrass написал(а):
Как думаете правильно будет, если я при помощи

preg_match('#ITowns.initialize(.+)#', $ans, $vilages);

буду выдерать эту строку в переменную, а потом из этой переменной брать нужные мне значения?

У меня пока только на это мозга хватает...)))

Спустя 47 минут, 3 секунды (10.07.2012 - 09:57) ArtemKrass написал(а):
В общем при помощи preg_match('#ITowns.initialize(.+)#', $ans, $vilages);
я забираю нужную мне строку в переменную.

Потом используя (СПАСИБО форумчанину PAK)

$m = explode(',', $vilages[0]);
foreach($m as $v)
{
if($p = strpos($v, 'id'))
{
$id[] = substr($v,$p+4);
}
elseif($p = strpos($v, 'name'))
{
$name[] = substr($v,$p+6);
}
}


echo '<br><br><pre>';
print_r($id);
echo '<br><br>';
print_r($name);
echo '</pre>';


выбираю нужные значения.
$name выбирается правильно, а вот $id нет.

Создается массив из 4-х элементов... Три из которых мне вообще не нужны... Нужен только первый элемент...


Array
(
[0] => 51543
[1] => e left\">\n\t
\n\t\t
\n\t\t
<\/div><%\n\t\tvar active_group_id = ITowns.getActiveTownGroup().id
[2] =>
[3] => n groups) {\n\t\t\t\tif (groups.hasOwnProperty(id) && parseInt(id
[4] => = \"0\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\n\t\t\t\tsorted_list = ITowns.getSortedTownGroupMapByName(group.id);\n\t\t\t\t%>\n\n\t\t\t\t
<%= cssClass %>\">\n\t\t\t\t\t
\n\t\t\t\t\t\t<%= (group.id === null ? msg_keine_gruppe : group.name ) %><\/a>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t
\" class=\"town_group\">\n\t\t\t\t\t\t<% for (i = 0
[5] => "g<%= id %>_splitted<%= splitted %>\" class=\"town_group\">\n\t\t\t\t\t\t\t<%}%>\n\n\t\t\t\t\t\t\t
\">\n\t\t\t\t\t\t\t\t\"><%= ITowns.getTown(town.id).name %><\/a>\n\t\t\t\t\t\t\t\t<% if (group.id !== null) { %>\n\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<% } %>\n\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<% } %>\n\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t<% }\n\t\t%><\/div>\n\t<\/div>\n<\/div>\n
\n\t
\n\t\t
<\/div>\n\t<\/div>\n<\/div>"});
)


Как же правильно сделать выборку?

Спустя 2 минуты, 51 секунда (10.07.2012 - 10:00) Игорь_Vasinsky написал(а):
пожалуйста.

Спустя 19 минут, 22 секунды (10.07.2012 - 10:20) pak написал(а):
ArtemKrass
покажите что находиться в $vilages[0]

Спустя 17 минут, 20 секунд (10.07.2012 - 10:37) ArtemKrass написал(а):
Цитата (pak @ 10.07.2012 - 07:20)
ArtemKrass
покажите что находиться в $vilages[0]

ITowns.initialize({"groups":null,"towns":[{"id":51543,"name" :"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440","island_x":788,"island_y":648,"plenty":"iron","ra re":"wood","has_conqueror":false,"researches":{"berth":f alse,"conscription":false,"mathematics":false},"favor":500}],"tmpl":"
\n\t
\n\t\t
<\/div>\n\t<\/div>\n<\/div>\n
\n\t
\n\t\t
\n\t\t
<\/div><%\n\t\tvar active_group_id = ITowns.getActiveTownGroup().id, group,\n\t\t\tsorted_list, id, num_of_groups = 0, i, l, j, l2, town, splitted = 0,\n\t\t\tcssClass, msg_keine_gruppe = '\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442';\n\n\t\t\t\/* Determinate the number of the groups *\/\n\t\t\tfor (id in groups) {\n\t\t\t\tif (groups.hasOwnProperty(id) && parseInt(id, 10) !== 0) {\n\t\t\t\t\tnum_of_groups++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcssClass = num_of_groups == 1 ? 'case1' : 'case2';\n\n\t\t\tfor (j = 0, l2 = groups.length; j < l2; j++) {\n\t\t\t\tgroup = groups[j];\n\n\t\t\t\tif (!group || group.id == \"0\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\n\t\t\t\tsorted_list = ITowns.getSortedTownGroupMapByName(group.id);\n\t\t\t\t%>\n\n\t\t\t\t
<%= cssClass %>\">\n\t\t\t\t\t
\n\t\t\t\t\t\t<%= (group.id === null ? msg_keine_gruppe : group.name ) %><\/a>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t
\" class=\"town_group\">\n\t\t\t\t\t\t<% for (i = 0, l = sorted_list.length; i < l; i++) {\n\t\t\t\t\t\t\ttown = group.towns[sorted_list[i]];\n\n\t\t\t\t\t\t\tif (num_of_groups == 1 && i > 0 && i%25 == 0) {\n\t\t\t\t\t\t\t\tsplitted++; %>\n\t\t\t\t\t\t\t\t<\/ul>
_splitted<%= splitted %>\" class=\"town_group\">\n\t\t\t\t\t\t\t<%}%>\n\n\t\t\t\t\t\t\t
\">\n\t\t\t\t\t\t\t\t\"><%= ITowns.getTown(town.id).name %><\/a>\n\t\t\t\t\t\t\t\t<% if (group.id !== null) { %>\n\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<% } %>\n\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<% } %>\n\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t<% }\n\t\t%><\/div>\n\t<\/div>\n<\/div>\n
\n\t
\n\t\t
<\/div>\n\t<\/div>\n<\/div>"});

Спустя 35 минут, 3 секунды (10.07.2012 - 11:12) pak написал(а):
Свернутый текст
ITowns.initialize({"groups":null,"towns":[{"id":51543,"name" :"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440","island_x":788,"island_y":648,"plenty":"iron","ra re":"wood","has_conqueror":false,"researches":{"berth":f alse,"conscription":false,"mathematics":false},"favor":500}],"tmpl":"
\n\t
\n\t\t
<\/div>\n\t<\/div>\n<\/div>\n
\n\t
\n\t\t
\n\t\t
<\/div><%\n\t\tvar active_group_id = ITowns.getActiveTownGroup().id, group,\n\t\t\tsorted_list, id, num_of_groups = 0, i, l, j, l2, town, splitted = 0,\n\t\t\tcssClass, msg_keine_gruppe = '\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442';\n\n\t\t\t\/* Determinate the number of the groups *\/\n\t\t\tfor (id in groups) {\n\t\t\t\tif (groups.hasOwnProperty(id) && parseInt(id, 10) !== 0) {\n\t\t\t\t\tnum_of_groups++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tcssClass = num_of_groups == 1 ? 'case1' : 'case2';\n\n\t\t\tfor (j = 0, l2 = groups.length; j < l2; j++) {\n\t\t\t\tgroup = groups[j];\n\n\t\t\t\tif (!group || group.id == \"0\") {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\n\t\t\t\tsorted_list = ITowns.getSortedTownGroupMapByName(group.id);\n\t\t\t\t%>\n\n\t\t\t\t
<%= cssClass %>\">\n\t\t\t\t\t
\n\t\t\t\t\t\t<%= (group.id === null ? msg_keine_gruppe : group.name ) %><\/a>\n\t\t\t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t
\" class=\"town_group\">\n\t\t\t\t\t\t<% for (i = 0, l = sorted_list.length; i < l; i++) {\n\t\t\t\t\t\t\ttown = group.towns[sorted_list[i]];\n\n\t\t\t\t\t\t\tif (num_of_groups == 1 && i > 0 && i%25 == 0) {\n\t\t\t\t\t\t\t\tsplitted++; %>\n\t\t\t\t\t\t\t\t<\/ul>
_splitted<%= splitted %>\" class=\"town_group\">\n\t\t\t\t\t\t\t<%}%>\n\n\t\t\t\t\t\t\t
\">\n\t\t\t\t\t\t\t\t\"><%= ITowns.getTown(town.id).name %><\/a>\n\t\t\t\t\t\t\t\t<% if (group.id !== null) { %>\n\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<% } %>\n\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<% } %>\n\t\t\t\t\t<\/ul>\n\t\t\t\t<\/div>\n\t\t\t<% }\n\t\t%><\/div>\n\t<\/div>\n<\/div>\n
\n\t
\n\t\t
<\/div>\n\t<\/div>\n<\/div>"});

из этого вам нужны только данные из первой строчки, т е из этой:

ITowns.initialize({"groups":null,"towns":[{"id":51543,"name" :"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440","island_x":788,"island_y":648,"plenty":"iron","ra re":"wood","has_conqueror":false,"researches":{"berth":f alse,"conscription":false,"mathematics":false},"favor":500}],"tmpl":"

???

Спустя 1 час, 50 минут, 7 секунд (10.07.2012 - 13:02) ArtemKrass написал(а):
да, все, что находится до "tmpl"

Спустя 20 минут, 40 секунд (10.07.2012 - 13:23) pak написал(а):

$m = explode(',', $vilages[0]);
foreach($m as $v)
{
echo $v.'<br>';
if($p = strpos($v, '"id"'))
{
$id[] = substr($v,$p+5);
}
elseif($p = strpos($v, 'name"'))
{
$name[] = substr($v,$p+7);
}
}


echo '<br><br><pre>';
print_r($id);
echo '<br><br>';
print_r($name);
echo '</pre>';

будет работать при условии если в $vilages[0] первая строчка будет похожа

Спустя 21 минута, 47 секунд (10.07.2012 - 13:45) ArtemKrass написал(а):
Работает!

Нашел тут еще информацию о json_decode

Можно ли с помощью него передать значения массива в переменные? В мануале написано что он возвращает данные JSON преобразованные в соответствующие типы PHP...

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

Спустя 1 час, 54 минуты, 3 секунды (10.07.2012 - 15:39) Игорь_Vasinsky написал(а):
не понял. что правильно выводит? какие значения в переменную?

Спустя 19 минут, 6 секунд (10.07.2012 - 15:58) ArtemKrass написал(а):
Что-то не получается у меня в json_decode разобраться.
Правильно ли я делаю???

Вот есть у меня JSON строка:
{"groups":null,"towns":[{"id":51543,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440","island_x":788,"island_y":648,"plenty":"iron","ra re":"wood","has_conqueror":false,"researches":{"berth":f alse,"conscription":false,"mathematics":false},"favor":500}]}


Для пробы делаю так:

<?php

$json = '{"groups":null,"towns":[{"id":51543,"name":"\u041a\u0440\u0430\u0441\u043d\u043e\u0434\u0430\u0440","island_x":788,"island_y":648,"plenty":"iron","ra re":"wood","has_conqueror":false,"researches":{"berth":f alse,"conscription":false,"mathematics":false},"favor":500}]}';

$obj = json_decode($json);
print $obj->{'id'};

?>


А он мне ничего не выводит...

Спустя 11 минут, 5 секунд (10.07.2012 - 16:09) Игорь_Vasinsky написал(а):
не верный Json ФОРМАТ

Цитата
Имя должно обрамляться в двойные кавычки

Цитата
"groups":null
"berth":f alse


И ПРОЧЕЕ

Спустя 3 дня, 2 часа, 54 минуты, 55 секунд (13.07.2012 - 19:04) ArtemKrass написал(а):
Значит json_decode мне не поможет? Я же не могу переделать ответ сервера...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.