Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Парсинг XML-файла №2
 
 автор: Shorr Kan   (09.10.2005 в 22:03)   письмо автору
 
 

http://sh opxml.com/EXPORT/xml.php?shop=336

Видимо, до конца я так и не разобрался с регулярными, поэтому и тут споткнулся.
Собственно, получить это все надо в удобный массив. Но содержимое тегов, а не вместе с ними.
Аттрибуты тоже нужны...

p.s. Мне кажется, что регулярные менее громоздки, чем xml, поэтому, наверное, тут их выгоднее использовать?

   
 
 автор: cheops   (10.10.2005 в 21:11)   письмо автору
 
   для: Shorr Kan   (09.10.2005 в 22:03)
 

Я его пока не переварил, но думаю это возможно...

   
 
 автор: Shorr Kan   (11.10.2005 в 08:35)   письмо автору
 
   для: cheops   (10.10.2005 в 21:11)
 

Если процесс кодоварения не очень затруднит - было бы очень приятно...

   
 
 автор: Shorr Kan   (12.10.2005 в 20:19)   письмо автору
 
   для: Shorr Kan   (11.10.2005 в 08:35)
 

Кхм? :)

   
 
 автор: cheops   (12.10.2005 в 20:48)   письмо автору
 
   для: Shorr Kan   (12.10.2005 в 20:19)
 

Исследовал, но ещё не добрался до разбора... никак с духом не соберусь составить регулярное выражение... уж больно дофига там всего :)))

PS Кстати, а что это за файл и откуда он?

   
 
 автор: Shorr Kan   (12.10.2005 в 21:09)   письмо автору
 
   для: cheops   (12.10.2005 в 20:48)
 

Партнерка, насколько я понял. Человек создает магазин, развивает и продает товары. Но на самом деле - продает ЭТОТ магазин, что вы видели. Ну а процент - владельцу сайта, откуда заказали.

   
 
 автор: isset   (13.10.2005 в 01:26)   письмо автору
 
   для: Shorr Kan   (09.10.2005 в 22:03)
 

В PHP5 есть чудесная вещь, SimpleXML
Для PHP4 есть аналог, но я не изучал его, http://minixml.psychogenic.com/

   
 
 автор: Shorr Kan   (18.10.2005 в 14:12)   письмо автору
 
   для: isset   (13.10.2005 в 01:26)
 

Спасибо, только xml нужен только для xml, а регулярные нужны для всего. Благодаря решениям cheops'а я плавно и в рабочей манере начинаю изучать регулярные. Поэтому-то, я и ожидаю решения и в данном случае :) *скромно разглядывая облака*

   
 
 автор: cheops   (18.10.2005 в 14:45)   письмо автору
 
   для: Shorr Kan   (18.10.2005 в 14:12)
 

Ещё не добрался :)))

   
 
 автор: Shorr Kan   (19.10.2005 в 16:40)   письмо автору
 
   для: cheops   (18.10.2005 в 14:45)
 

А облаков много, так что это не страшно.

   
 
 автор: Shorr Kan   (26.10.2005 в 15:59)   письмо автору
 
   для: Shorr Kan   (19.10.2005 в 16:40)
 

Нет, теперь там сплошное облако, разглядывать просто неинтересно.

Это я так напоминаю... :)

   
 
 автор: Shorr Kan   (29.10.2005 в 02:57)   письмо автору
 
   для: Shorr Kan   (26.10.2005 в 15:59)
 

Честно говоря, мне в составлении этой регулярки - действительно нужна помощь. А вернее - помощь нужна в работе над этим проектом - помощь именно в виде предоставления готового регулярного выражения. Которое, разумеется, я потом буду анализировать и пытаться понимать. Но на данном этапе - делать мне дальше очень много, а ступор весь - в остутствии возможности парсинга. Я бы мог это делать обычными строковыми функциями, но в итоге они работают медленнее с подобной структурой.

   
 
 автор: cheops   (29.10.2005 в 14:30)   письмо автору
 
   для: Shorr Kan   (29.10.2005 в 02:57)
 

/*Посмотрел ещё раз*/ Блин больно уж он здоровый гад... может мы его по частям как начнём пилить, сначала одну часть вытащим, потом будем усложнять регулярное выражение?

   
 
 автор: Shorr Kan   (29.10.2005 в 23:17)   письмо автору
 
   для: cheops   (29.10.2005 в 14:30)
 

Да запросто. Итог-то нужен простой - нужно иметь переменные из каждого раздела. Описание товара, его цена, и так далее. Т.е., чтобы в нужном месте можно было вставить описание, в другом - цену, в третьем - название. Собственно, вероятно это будет легче разобрав массив несколько раз - за первый проход вытащить цену, за второй - цену... Хотя, это наверное дольше будет при обработке...

   
 
 автор: cheops   (30.10.2005 в 23:38)   письмо автору
 
   для: Shorr Kan   (29.10.2005 в 23:17)
 

По продуктам можно пройтись следующим образом
<?php
  $content 
file_get_contents("xml.xml");
  
$pattern "|<product order=\"([^\"]+)\"[\s]+ID=\"([^\"]+)\"[\s]+categoryID=\"([^\"]+)\"[\s]+time_available=\"([^\"]+)\" in_stock=\"([^\"]+)\"[\s]+is_new=\"([^\"]+)\"[\s]+manufacturer=\"([^\"]+)\"[\s]+url=\"([^\"]*)\"[\s]+weight=\"([^\"]+)\" quantity=\"([^\"]+)\"[\s]+num_choosed=\"([^\"]+)\"[\s]+price=\"([^\"]+)\"[\s]+opt1=\"([^\"]+)\" price1=\"([^\"]+)\"[\s]+opt2=\"([^\"]+)\"[\s]+price2=\"([^\"]+)\"|isU";
  
preg_match_all($pattern,$content,$out);
  echo 
"<pre>";
  
print_r($out);
  echo 
"</pre>";
?>

PS Пробелы заменить на [\s]+

   
 
 автор: Shorr Kan   (01.11.2005 в 09:14)   письмо автору
 
   для: cheops   (30.10.2005 в 23:38)
 

А у меня в выдаче:


Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
        )

    [2] => Array
        (
        )

    [3] => Array
        (
        )

    [4] => Array
        (
        )

    [5] => Array
        (
        )

    [6] => Array
        (
        )

    [7] => Array
        (
        )

    [8] => Array
        (
        )

    [9] => Array
        (
        )

    [10] => Array
        (
        )

    [11] => Array
        (
        )

    [12] => Array
        (
        )

    [13] => Array
        (
        )

    [14] => Array
        (
        )

    [15] => Array
        (
        )

    [16] => Array
        (
        )

)


p.s. А нельзя ли где-нибудь галочку поставить, чтобы письма с форума приходили, если кто-то написал в теме, где человек когда-то писал?

   
 
 автор: cheops   (01.11.2005 в 12:57)   письмо автору
 
   для: Shorr Kan   (01.11.2005 в 09:14)
 

Хм... а файл тот же самый?

PS Пока нет, но в ближайшее время планируется ввести RSS-канал на каждую тему - можно будет следить за ответами в выбранных темах.

   
 
 автор: Shorr Kan   (01.11.2005 в 16:18)   письмо автору
 
   для: cheops   (01.11.2005 в 12:57)
 

Абсолютно тот же самый, только вместо file_get_contents("xml.xml"); - я использовал file_get_contents("ссылку, которую давал, с поправкой пробела");
Что, собственно, разумеется, так как файл-то - не локальный, а удаленный. Именно оттуда, с того сервера.

   
 
 автор: cheops   (01.11.2005 в 23:14)   письмо автору
 
   для: Shorr Kan   (01.11.2005 в 16:18)
 

Хм... а если сохранить файл на локальный диск - тоже ничего не отображает? Попробуйте скрипт в аттаче...

   
 
 автор: Shorr Kan   (02.11.2005 в 04:48)   письмо автору
 
   для: cheops   (01.11.2005 в 23:14)
 

А у меня этот xml-файл (оттуда... С сервера) не сохраняется. Совершенно. Попробовал и IE 5 , и IE 6 (ну все что есть...). Реакции - ноль. В любых форматах пытался сохранить.

Что касается скрипта - да, точно такой. Только URL, вместо имени файла.

   
 
 автор: cheops   (02.11.2005 в 12:10)   письмо автору
 
   для: Shorr Kan   (02.11.2005 в 04:48)
 

Дело в том, что я при выкладывании скрипта в форум, чтобы не портить страницу - несколько его порезал - попробуйте тот который в архиве - он исходный.

   
 
 автор: Shorr Kan   (02.11.2005 в 19:13)   письмо автору
 
   для: cheops   (02.11.2005 в 12:10)
 

Да, вы правы, сработало. Но теперь СПЛОШНЫЕ цифры в выдаче. Я просто ошарашен.

Я так понимаю, что $out там имеет с [0] до [16] . Вы не могли бы поясняловку написать к каждому индексу массива - что это из целевого файла?

Я извиняюсь за... непонятливость, но просто столько цифр я еще никогда в жизни не видел...

   
 
 автор: cheops   (02.11.2005 в 19:30)   письмо автору
 
   для: Shorr Kan   (02.11.2005 в 19:13)
 

:))) Да хорошо, что мы по частям стали разбирать - в конце концов цифр будет в несколько раз больше... Это регулярное выражение находит блок
        <product order="52" ID="7890" categoryID="102"
                 time_available="1118379600" in_stock="1" is_new="0"
                 manufacturer="0" url="" weight="5.5"
                 quantity="1000000" num_choosed="4"
                 price="69.99" opt1="0" price1="0" opt2="0" price2="0">

[0] - order
[1] - ID
[2] - categoryID
...
[16] - price2

   
 
 автор: Shorr Kan   (03.11.2005 в 03:14)   письмо автору
 
   для: cheops   (02.11.2005 в 19:30)
 

Пересчитал по пальцам - получилось 16. Но я считал как человек, начиная с "раз". А у нас массив начинается с нуля. У шестеренкокрута - 17 результатов, а у меня 16. Я попробовал даже по пальцам считать. Откуда лишние детали взялись? Или куда у меня подевались недостающие?

Попробуем посчитать его методом, начиная с нуля. Может быть что-то иное получится...

order (ноль)
ID (один)
categoryID (два)
time_available (три)
in_stock (четыре)
is_new (пять)
manufacturer (шесть)
url (семь)
weight (восемь)
quantity (девять)
num_choosed (десять)
price (одиннадцать)
opt1 (двенадцать)
price1 (тринадцать)
opt2 (четырнадцать)
price2 (пятнадцать)

хмм? Где "шестнадцать"?

   
 
 автор: cheops   (03.11.2005 в 13:12)   письмо автору
 
   для: Shorr Kan   (03.11.2005 в 03:14)
 

Ой нет...
[1] - order
[2] - ID
[3] - categoryID
...
[16] - price2
так как 0 - это всё регулярнове выражение, а 1, 2, 3, ..., 16 соответствует круглым скобкам.

   
 
 автор: Shorr Kan   (03.11.2005 в 15:06)   письмо автору
48 Кб
 
   для: cheops   (03.11.2005 в 13:12)
 

Отлично. Далее, в выдаче я вижу $out[0] и $out[2] , а где $out[1] ?

Как я понял, $out[0][0] использовать не надо, надо начиная с $out[0][1] . А вот $out[2][0] - как раз используемое... это ID самого первого product . Что-то я логики не схватываю.

p.s. То что у меня в выдаче - я присобачил...

   
 
 автор: cheops   (03.11.2005 в 21:37)   письмо автору
 
   для: Shorr Kan   (03.11.2005 в 15:06)
 

Дур дом :))) А куда делось... я гляжу ещё и 16 не хватает...

   
 
 автор: Shorr Kan   (04.11.2005 в 11:44)   письмо автору
 
   для: cheops   (03.11.2005 в 21:37)
 

Риторический вопрос - ну неужели нельзя было сделать человеческий файл для разбора? Построчные данные - и вперед... разделитель - "|" ... Красотища. Нет, намутили.

Так. Ну раз данные пропадают какие-то - значит нужна проверка на их существование. И если нету - весь этот массив не использовать. Видимо так... Ладно, буду думать.

А со следующим блоком?

   
 
 автор: cheops   (04.11.2005 в 13:17)   письмо автору
 
   для: Shorr Kan   (04.11.2005 в 11:44)
 

Вообще это не нормально, а у вас все модификаторы в регулярном выражении "isU" - s никуда не задевалась?

   
 
 автор: Shorr Kan   (05.11.2005 в 08:07)   письмо автору
 
   для: cheops   (04.11.2005 в 13:17)
 

Конечно нет - я вообще ничего, кроме цели file_get_contents - не менял, просто ваш файл запустил. Смотрите файл...

================
О, а я похоже понял. У него там встречаются местечки, где пустое значение. Ну например, есть блок, где url="" . Это никак не может влиять?

   
 
 автор: Shorr Kan   (09.11.2005 в 12:59)   письмо автору
 
   для: Shorr Kan   (05.11.2005 в 08:07)
 

Может?

   
 
 автор: cheops   (09.11.2005 в 13:06)   письмо автору
 
   для: Shorr Kan   (09.11.2005 в 12:59)
 

Что-то пропустил ваш предыдущий вопрос... вообще говоря не должно, так как у нас стоит любое число символов *... В этом случае, если бы не было соответствия, регулярное выражение не реагировало бы вообще на всю товарную позицию.

   
 
 автор: Shorr Kan   (09.11.2005 в 22:52)   письмо автору
 
   для: cheops   (09.11.2005 в 13:06)
 

В любом случае - выхода нет. Раз уж так парсит... ПРидется проверку делать, как я говорил. Может быть, тогда дальнейшие блоки?..

   
 
 автор: cheops   (09.11.2005 в 23:44)   письмо автору
 
   для: Shorr Kan   (09.11.2005 в 22:52)
 

Кстати, может у вас необходима настройка локали, как в теме http://www.softtime.ru/forum/read.php?id_forum=6&id_theme=6084?

PS Эта... давайте как нибудь в новую тему перебираться :))), а то эта уже длинная...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования