Forum Webscript.Ru

Программирование => Регулярные выражения => Тема начата: Abram от 20 Февраля 2004, 12:44:36

Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Abram от 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\\.]*?)(?:<\\/A>)/s
как правильно писать?
3. И последний вопрос:
Допустим вырезал я все строки, получилось у меня строка например:
 20.02
05:30  Товар1
Товар2  35  26.92  27.05  270.5
Теперь это все надо вбить ее в базу данных соответственно с 6 полями, тоесть как имея такую строку получить доступ к выделенным подстрокам.
Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Макс от 20 Февраля 2004, 13:06:32
Abram
проще буде договориться с теми, кто прайс генерирует. Пусть они его генерируют либо в более чистом ХТМЛ либо вообще в каком-тодргом формате (CSV например)
Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Abram от 20 Февраля 2004, 14:24:59
По другому никак, ребята помогите времени уже почти нет!!!!!!!
Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Макс от 20 Февраля 2004, 15:21:24
Abram
никто здесь не будет разбираться с таким кривым ХТМЛ. Почему он не валидный ? Почему теги не закрываются ? ( например)
Цитировать
Abram:
 но оно не работает для поиска 26.92 и 27.05:

/\\d\\d\\.\\d\\d(?=<\\/A>)/s
Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Макс от 20 Февраля 2004, 15:22:26
опять форум лишний пробел вставил :(
Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Abram от 20 Февраля 2004, 15:51:38
Ну хорошо будем разбираться, а что за прикол с этим, какой здесь принцип действия регов?
Цитировать
$res=preg_match_all(\'/TBODY/s\'... выводит все TBODY ,а:
$res=preg_match_all(\'/$res=preg_match_all(\'/
Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Nickii от 20 Февраля 2004, 23:06:34
Abram
В первом и третьем случае ты указываешь конкретные слова для поиска, пусть это TBODY и <. Во втором я бы минимизировал числитель, т.е. поставил не s а sU. Попробуй. Хотя если ты код привел правильно все должно искаться соответственно.
Название: Парсинг прайса ЧАСТЬ 2
Отправлено: Yukko от 21 Февраля 2004, 01:09:17
Abram
мама моя родная... ты хоть пытался разобраться в этом сам?
Ответ на вопрос №1:
что функция preg_match_all возвращает?

$string = "


20.02
05:30
Товар2
35
onclick=\\"return m(this)\\">26.92
id=r3_3143svsfd onclick=\\"return m(this)\\">27.05
270.5
   ";
preg_match_all("/print_r($matches);
?>
скопипейсти себе в редактор, не добавляя больше не строчки и ты увидишь, что оно выводит:
Array (
  • => Array (
  • =>

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

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

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

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

$string = "


20.02
05:30
Товар2
35
onclick=\\"return m(this)\\">26.92
id=r3_3143svsfd onclick=\\"return m(this)\\">27.05
270.5
   ";
preg_match_all("/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);
тоже самое надо ставить обратный слеш перед обратным слешем, чтобы он его не кушал