2010-02-01 12 views
10

Próbuję uruchomić preg_match, aby wyodrębnić atrybut SRC z pierwszego tagu IMG w artykule (w tym przypadku, zapisanym w $ row-> introtext).Dopasowywanie atrybutu SRC znacznika IMG przy użyciu preg_match

preg_match('/\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\']*)/i', $row->introtext, $matches); 

Zamiast się coś podobnego

images/stories/otakuzoku1.jpg 

z

<img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku's store" /> 

mam tylko

0 

regex powinny być w porządku, ale nie mogę powiedzieć, dlaczego wydaje się pasować do atrybutu granicznego te, a nie atrybut src.

Ewentualnie, jeśli masz dość cierpliwości, aby przeczytać tak daleko, bez przechodzenia bezpośrednio do pola odpowiedzi i wpisując "użyj parsera HTML/XML", dobrym poradnikiem dla jednego może być zalecany, ponieważ mam problem ze znalezieniem jeden w ogóle, który dotyczy PHP 4.

PHP 4.4.7

Odpowiedz

28

Twoje wyrażenie jest nieprawidłowe. Wypróbuj:

preg_match('/< *img[^>]*src *= *["\']?([^"\']*)/i', $row->introtext, $matches); 

Uwaga na usunięcie nawiasów wokół img i src oraz kilka innych porządków.

+1

To załatwiło sprawę. Nie jest to "idealne" rozwiązanie do analizowania kodu HTML, ale jedyne rozwiązanie, które działa i daje niezbędny rezultat. Dzięki! – KyokoHunter

+2

jako notatkę dodatkową, $ matches [0] zawiera pełny tag IMG, a $ matches [1] zawiera źródłowy identyfikator URI. –

2

Spróbuj:

include ("htmlparser.inc"); // from: http://php-html.sourceforge.net/ 

$html = 'bla <img src="images/stories/otakuzoku1.jpg" border="0" alt="Inside Otakuzoku\'s store" /> noise <img src="das" /> foo'; 

$parser = new HtmlParser($html); 

while($parser->parse()) { 
    if($parser->iNodeName == 'img') { 
     echo $parser->iNodeAttributes['src']; 
     break; 
    } 
} 

która będzie produkować:

images/stories/otakuzoku1.jpg 

Należy pracować z PHP 4.x

+0

+1, fajny, właśnie napisałem coś na ten temat używając tego starego parsera DOM :) – karim79

+0

Wygląda na to, że przyda się - spróbuje i zgłoś się tutaj. – KyokoHunter

+0

Niektóre problemy z uruchomieniem htmlparser.inc. Komunikat o błędzie mówi, że klasa jest już zainicjowana, ale nią nie jest. Będę trzymać się aktualizacji dostawcy do PHP 5 ... – KyokoHunter

5

Oto sposób to zrobić z wbudowanych funkcji (PHP> = 4):

$parser = xml_parser_create(); 
xml_parse_into_struct($parser, $html, $values); 
foreach ($values as $key => $val) { 
    if ($val['tag'] == 'IMG') { 
     $first_src = $val['attributes']['SRC']; 
     break; 
    } 
} 

echo $first_src; // images/stories/otakuzoku1.jpg 
1

regex Kiedyś było znacznie prostsze. Mój kod zakłada, że ​​ciąg jest przekazywany do niej zawiera dokładnie jeden tag img bez innych znaczników:

$pattern = '/src="([^"]*)"/'; 

zobaczyć moją odpowiedź tutaj, aby uzyskać więcej informacji: How to extract img src, title and alt from html using php?

+0

"dokładnie jeden znacznik img bez żadnych innych znaczników"? To całkiem konkretny przypadek, nieprawdaż, może trochę zbyt specyficzny dla prawie wszystkich: [ – Andrew

1

Jeśli trzeba użyć samego preg_match(), spróbuj tego :

preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches); 
Powiązane problemy