2015-01-27 4 views
-1

Я пытаюсь разобрать веб-сайт и получить имя или URL-адрес изображения.PHP Preg_match Изображение с url

Пример URL: http://www.theworkingmanstore.com/georgia-gr14-infants-romeo.aspx

Есть 6 изображений или более в одном <td>, и я только хочу, чтобы получить первый IMG SRC в этой <td>.

Я уверен, что это возможно, возможно, с Dom Parser, но у меня нет опыта с ним.

Любая помощь будет оценена по достоинству.

Благодаря

$html = file_get_contents($url); 
$reg = '/img src=["\']?([^"\' ]*)["\' ]/'; 
preg_match_all($reg, $html, $m); 
$arr = array_map(function($v){ 
return trim(str_replace(array('img src=', 'http://www.theworkingmanstore.com'), '', $v), '"');}, $m[0]); 
print_r($arr) 

Выход: Это вывод из регулярных выражений

Array 
(
    [0] => /images/logo2.png 
    [1] => /images/mod_head_category_lt.gif 
    [2] => '/images/products/display/GR14_EXTRALARGE.jpg' 
    [3] => '/images/products/thumb/GR14_EXTRALARGE.jpg' 
    [4] => '/images/products/thumb/GR14_8_EXTRALARGE.jpg' 
    [5] => '/images/products/thumb/GR14_5_EXTRALARGE.jpg' 
    [6] => '/images/products/thumb/GR14_3_EXTRALARGE.jpg' 
    [7] => '/images/products/thumb/GR14_42_EXTRALARGE.jpg' 
    [8] => '/images/products/thumb/GR14_2_EXTRALARGE.jpg' 
    [9] => /images/freeshipping.jpg 
    [10] => /images/facebook_32.png 
    [11] => images/twitter_32.png 
    [12] => images/googleplus_32.png 
    [13] => images/pinterest_32.png 
    [14] => /images/payments.gif 
    [15] => /images/brands/the-working-man.jpg 
) 

Пробовал на дом Parser предложение:

$html = file_get_contents($url) ; 
$dom = new DOMDocument(); 
$dom->loadHtml($html);  
$xpath = new DOMXPath($dom); 
echo $xpath->evaluate(
'string(//td/a[@id = "Zoomer"]/descendant::img[1]/@src)' 
); 

Got Ошибка в качестве вывода: Внимание: DOMDocument: : loadHTML() [domdocument.loadhtml]: тег nav недействителен в Entity

+0

Вы говорите, что у вас нет опыта работы с DOM парсер, но это вполне может быть прекрасное время, чтобы узнать, как использовать его. Скорее всего, вы столкнетесь с недостатками использования регулярных выражений, чтобы снова анализировать HTML в будущем, возможно, даже в этом самом проекте. Regexes просто не справляются с задачей разбора произвольного HTML. –

ответ

0

Вы можете использовать это регулярное выражение.

$html = 'Your HTML'; 
$reg = '/img src=["\']?([^"\' ]*)["\' ]/'; 
preg_match_all($reg, $html, $m); 
$arr = array_map(function($v){ 
    return trim(str_replace(array('img src=', 'http://www.theworkingmanstore.com'), '', $v), '"'); 
}, $m[0]); 

print '<pre>'; 
print_r($arr); 
print '</pre>'; 

Выход:

Array 
(
    [0] => /images/products/display/GR14_EXTRALARGE.jpg 
    [1] => /images/products/detail/GR14_EXTRALARGE.jpg 
    [2] => /images/products/thumb/GR14_EXTRALARGE.jpg 
    [3] => /images/products/thumb/GR14_8_EXTRALARGE.jpg 
    [4] => /images/products/thumb/GR14_5_EXTRALARGE.jpg 
    [5] => /images/products/thumb/GR14_3_EXTRALARGE.jpg 
    [6] => /images/products/thumb/GR14_42_EXTRALARGE.jpg 
    [7] => /images/products/thumb/GR14_2_EXTRALARGE.jpg 
) 
+0

Спасибо.это похоже на работу. – user1443402

+0

Добро пожаловать :) – MH2K9

+0

На самом деле это анализирует изображение, которое мне нужно: '/images/products/display/GR14_EXTRALARGE.jpg' Не хочу, чтобы одинарные кавычки вокруг него – user1443402

4

В DOM-нибудь является узлом, то img элементы и атрибуты src тоже. XPath позволяет вам выбирать списки узлов из DOM.

$dom = new DOMDocument(); 
$dom->loadHtml($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->evaluate('//img/@src') as $src) { 
    echo $src->value, "\n"; 
} 

Выходные:

http://www.theworkingmanstore.com/images/products/display/GR14_EXTRALARGE.jpg 
http://www.theworkingmanstore.com/images/products/detail/GR14_EXTRALARGE.jpg 
/images/products/thumb/GR14_EXTRALARGE.jpg 
/images/products/thumb/GR14_8_EXTRALARGE.jpg 
/images/products/thumb/GR14_5_EXTRALARGE.jpg 
/images/products/thumb/GR14_3_EXTRALARGE.jpg 
/images/products/thumb/GR14_42_EXTRALARGE.jpg 
/images/products/thumb/GR14_2_EXTRALARGE.jpg 

XPath позволяет выйти сложные условия. Следующие примеры выводят атрибуты src первого img внутри любого td.

$dom = new DOMDocument(); 
$dom->loadHtml($html);  
$xpath = new DOMXPath($dom); 

foreach ($xpath->evaluate('//td/descendant::img[1]/@src') as $src) { 
    echo $src->value, "\n"; 
} 

Выход:

http://www.theworkingmanstore.com/images/products/display/GR14_EXTRALARGE.jpg 

HTML, в вопросе содержит только один td, и более важным img находится внутри a элемента с атрибутом id. Таким образом, это должно быть единственное уникальное значение. Это позволяет использовать список узлов непосредственно в XPath и возвращать его как строку.

$dom = new DOMDocument(); 
$dom->loadHtml($html);  
$xpath = new DOMXPath($dom); 
echo $xpath->evaluate(
    'string(//td/a[@id = "Zoomer"]/descendant::img[1]/@src)' 
); 

Выход:

http://www.theworkingmanstore.com/images/products/display/GR14_EXTRALARGE.jpg 
+0

Я попытался это сделать, и получил эту ошибку : DOMDocument :: loadHTML() [domdocument.loadhtml]: тег nav недействителен в Entity. используя $ html = file_get_contents ($ url) перед первой строкой кода, чтобы специфицировать html для разбора – user1443402

+0

Это предупреждение, потому что HTML не полностью соответствует HTML 4 ('nav' - это тег HTML5), вы можете отключить их 'libxml_use_internal_errors (истинные)'. – ThW

+0

Обновленный начальный вопрос с обоими предложениями. – user1443402