регулярное выражение, php, preg_match - PullRequest
0 голосов
/ 15 июня 2010

Я пытаюсь извлечь значение пробега из разных страниц Ebay, но я застрял, потому что, кажется, слишком много шаблонов, потому что страницы немного отличаются.Поэтому я хотел бы знать, можете ли вы помочь мне с лучшим рисунком.Некоторые примеры элементов следующие: http://cgi.ebay.com/ebaymotors/1971-Chevy-C10-Shortbed-Truck-/250647101696?cmd=ViewItem&pt=US_Cars_Trucks&hash=item3a5bbb4100 http://cgi.ebay.com/ebaymotors/1987-HANDICAP-LEISURE-VAN-W-WHEEL-CHAIR-LIFT-/250647101712?cmd=ViewItem&pt=US_Cars_Trucks&hash=item3a5bbb4110 http://cgi.ebay.com/ebaymotors/ws/eBayISAPI.dll?ViewItemNext&item=250647101696
Пожалуйста, посмотрите шаблоны по следующей ссылке (я до сих пор не могу понять, как избежать здесь HTML

http://pastebin.com/zk4HAY3T

Однако их недостаточно, так как кажется, что есть еще новые скороговорки ....

Ответы [ 2 ]

2 голосов
/ 15 июня 2010

Не используйте регулярные выражения для разбора HTML . Даже для относительно простой вещи, такой как эта, регулярные выражения делают вас сильно зависимыми от точной разметки.

Вы можете использовать DOMDocument и XPath для удобного захвата значения, и оно несколько более устойчиво к изменениям на странице:

  $doc = new DOMDocument();

  @$doc->loadHtmlFile($url);

  $xpath = new DOMXpath($doc);
  foreach ($xpath->query('//th[contains(., "Mileage")]/following-sibling::td') as $td) {
    var_dump($td->textContent);
  }

Запрос XPath ищет <th>, который содержит слово «Пробег», а затем выбирает <td> s, следующие за ним.

Затем вы можете удалить суффикс miles и избавиться от запятых, используя str_replace или substr.

0 голосов
/ 15 июня 2010

Это должно быть немного более общим - не важно, что находится внутри html-тегов. Он работает по всем трем ссылкам, которые вы указали.

/Mileage[^<]*<[^>]*><[^>]*>(.*?)\s*miles/i

Конечно, могут быть лучшие способы, в зависимости от того, какие у вас есть другие ограничения, но это хорошая отправная точка.

Распознав дублирование, вы могли бы упростить (по крайней мере, логически) немного больше:

/Mileage[^<]*(?:<[^>]*>){2}(.*?)\s*miles/i

Вы ищете два html-тега подряд между словами «Пробег» и «мили». Это часть (?:<[^>]*>){2}. ?: говорит ему не запоминать эту последовательность, так что $matches[1] все еще содержит искомое число, а {2} указывает, что вы хотите точно соответствовать предыдущей последовательности дважды.

...