Автор Тема: Парсинг прайса ЧАСТЬ 2  (Прочитано 3015 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Abram

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 116
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг прайса ЧАСТЬ 2
« : 20 Февраля 2004, 12:44:36 »
1. Есть опять проблемы, хотя вроде бы все правильно пишешь, а результата нет, например:
$res=preg_match_all(\'/TBODY/s\'... выводит все TBODY ,а:
$res=preg_match_all(\'/$res=preg_match_all(\'/
2. Теперь о моем прайсе:
Итак строка прайса:

 
    20.02
05:30
    Товар1
Товар2
    35
          onclick="return m(this)">26.92
      id=r3_3143svsfd onclick="return m(this)">27.05
    270.5

таких строк очень много
Пишу:
$res=preg_match_all(\'/(?:)([\\D]+?)(?:)/s\',$order,$found);   
Выводит все Товар1
Товар2 изо всех строк. Теперь вырезаем еще 35:
$res=preg_match_all(\'/(?:)([\\D]+?)(?:)([\\d]*?)(?:<\\/B>Ведь вроде правильно написал.
Цитировать
      onclick="return m(this)">26.92
      id=r3_3143svsfd onclick="return m(this)">27.05

Вот то что я написал для віделеного фрагмента, но оно не работает для поиска 26.92 и 27.05:
/(?:*?]>$)([0-9\\.]*?)(?:<\\/A>
*?])([0-9\\.]*?)>$([0-9\\.]*?)(?:<\\/A>)/s
как правильно писать?
3. И последний вопрос:
Допустим вырезал я все строки, получилось у меня строка например:
 20.02
05:30  Товар1
Товар2  35  26.92  27.05  270.5
Теперь это все надо вбить ее в базу данных соответственно с 6 полями, тоесть как имея такую строку получить доступ к выделенным подстрокам.

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Парсинг прайса ЧАСТЬ 2
« Ответ #1 : 20 Февраля 2004, 13:06:32 »
Abram
проще буде договориться с теми, кто прайс генерирует. Пусть они его генерируют либо в более чистом ХТМЛ либо вообще в каком-тодргом формате (CSV например)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Abram

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 116
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг прайса ЧАСТЬ 2
« Ответ #2 : 20 Февраля 2004, 14:24:59 »
По другому никак, ребята помогите времени уже почти нет!!!!!!!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Парсинг прайса ЧАСТЬ 2
« Ответ #3 : 20 Февраля 2004, 15:21:24 »
Abram
никто здесь не будет разбираться с таким кривым ХТМЛ. Почему он не валидный ? Почему теги не закрываются ? ( например)
Цитировать
Abram:
 но оно не работает для поиска 26.92 и 27.05:

/\\d\\d\\.\\d\\d(?=<\\/A>)/s
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Парсинг прайса ЧАСТЬ 2
« Ответ #4 : 20 Февраля 2004, 15:22:26 »
опять форум лишний пробел вставил :(
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Abram

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 116
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг прайса ЧАСТЬ 2
« Ответ #5 : 20 Февраля 2004, 15:51:38 »
Ну хорошо будем разбираться, а что за прикол с этим, какой здесь принцип действия регов?
Цитировать
$res=preg_match_all(\'/TBODY/s\'... выводит все TBODY ,а:
$res=preg_match_all(\'/$res=preg_match_all(\'/

Оффлайн Nickii

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 218
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.srccode.spb.ru
Парсинг прайса ЧАСТЬ 2
« Ответ #6 : 20 Февраля 2004, 23:06:34 »
Abram
В первом и третьем случае ты указываешь конкретные слова для поиска, пусть это TBODY и <. Во втором я бы минимизировал числитель, т.е. поставил не s а sU. Попробуй. Хотя если ты код привел правильно все должно искаться соответственно.

Оффлайн Yukko

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1586
  • +0/-0
  • 0
    • Просмотр профиля
    • http://estrabota.com.ua
Парсинг прайса ЧАСТЬ 2
« Ответ #7 : 21 Февраля 2004, 01:09:17 »
Abram
мама моя родная... ты хоть пытался разобраться в этом сам?
Ответ на вопрос №1:
что функция preg_match_all возвращает?

<?
$string "
<TBODY class=row1>
<TR>
<TD>20.02<BR>05:30
<TD class=lТовар1<BR>Товар2
<TD><B>35</B>
<TD><A href=\\"
http://link/\\" id=sfsd32dfs
onclick=\\"return m(this)\\">26.92</A><BR><A href=\\"http://link/\\"
id=r3_3143svsfd onclick=\\"return m(this)\\">27.05</A>
<
TD><B>270.5</B>
</
TR>    ";
preg_match_all("
/<TBODY/s", $string$matches);
print_r(
$matches);
?>

скопипейсти себе в редактор, не добавляя больше не строчки и ты увидишь, что оно выводит:
Array (
  • => Array (
  • =>

Ты работаешь с тегами! и выводит в тело документа он тоже тег! следующий тег, который пойдет после того, что выведет print_r(), автоматически скажет твоему эксплореру закрыть тег , и после этого ты его увидишь только после того, как просмотришь исходный код документа.

Чтобы правильно работать во время парсинга html документов надо вплотную работать при выводе результатов с функцией [p]htmlspecialchars[/p] а для этого тебе правильно надо разобрать массив, который выдаст preg_match_all на строки!!!

Ответ на вопрос №2:
Надо использовать опережающую и ретроспективную проверку, а так же использовать условие выбора!

вот результирующий код:

<?
$string "
<TBODY class=row1>
<TR>
<TD>20.02<BR>05:30
<TD class=lТовар1<BR>Товар2
<TD><B>35</B>
<TD><A href=\\"
http://link/\\" id=sfsd32dfs
onclick=\\"return m(this)\\">26.92</A><BR><A href=\\"http://link/\\"
id=r3_3143svsfd onclick=\\"return m(this)\\">27.05</A>
<
TD><B>270.5</B>
</
TR>    ";
preg_match_all("
/<TBODY/s", $string$matches);
foreach(
$matches as $item)
{
  foreach(
$item as $tbody)
  {
     echo htmlspecialchars(
$tbody);
  }
}
//конец разборок с TBODY

echo "
";
//начало разборок с парсингом Html
preg_match_all("
/(?<=>\\)(\\\\d*\\\\.\\\\d*)(?=<\\\\/A>|<\\\\/B>\\)/", $string$matches);
print_r(
$matches);
?>


ответ на вопрос №3 ты получишь, когда будет понятно, какие данные куда должны пойти из сформированной тобой строки.

Макс и другие
чтобы форум не ставил пробел перед скобкой, надо перед ней поставить обратный слеш. Вот так выглядит реально строка, которую я пишу, чтобы получить то, что вы видите в коде выше:
preg_match_all("/(?<=>\\)(\\\\d*\\\\.\\\\d*)(?=<\\\\/A>|<\\\\/B>\\)/", $string, $matches);
тоже самое надо ставить обратный слеш перед обратным слешем, чтобы он его не кушал
« Последнее редактирование: 21 Февраля 2004, 01:32:11 от Yukko »
работа в Украине

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28