2010-02-01 3 views
10

J'essaie d'exécuter preg_match pour extraire l'attribut SRC de la première balise IMG dans un article (dans ce cas, stocké dans $ row-> introtext).Attribut SRC de balise IMG correspondant en utilisant preg_match

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

Au lieu d'obtenir quelque chose comme

images/stories/otakuzoku1.jpg 

de

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

Je reçois juste

0 

Le regex doit être juste, mais je ne peux pas dire pourquoi il semble correspondre à la frontière attribu te et pas l'attribut src. Alternativement, si vous avez eu la patience de lire ceci jusqu'à présent sans passer directement au champ de réponse et en tapant 'utiliser un analyseur HTML/XML', peut-on recommander un bon tutoriel, car j'ai de la difficulté à trouver un à tout ce qui est applicable à PHP 4.

PHP 4.4.7

Répondre

28

Votre expression est incorrecte. Essayez:

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

Notez la suppression des parenthèses autour de img et src et d'autres nettoyages.

+1

Cela a fait l'affaire. Pas la solution «idéale» d'analyser réellement le HTML, mais la seule solution qui fonctionne et donne le résultat nécessaire. Merci! – KyokoHunter

+2

en note, $ matches [0] contient la balise IMG complète et $ matches [1] contient l'URI source. –

2

Essayez:

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; 
    } 
} 

qui produira:

images/stories/otakuzoku1.jpg 

Il devrait fonctionner avec PHP 4.x.

+0

+1, gentil, j'étais juste en train de formuler quelque chose à cet effet en utilisant cet ancien analyseur DOM :) – karim79

+0

Cela me semble utile - je vais essayer et faire un rapport ici. – KyokoHunter

+0

Quelques problèmes pour que htmlparser.inc fonctionne. Le message d'erreur indique que la classe est déjà initiée, mais ce n'est pas le cas. Je vais tenir le coup pour une mise à niveau du fournisseur vers PHP 5 ... – KyokoHunter

5

Voici une façon de le faire avec des fonctions intégrées (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

Le regex j'était beaucoup plus simple. Mon code suppose que la chaîne étant passée à elle contient exactement une balise img sans autre balisage:

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

Voir ma réponse ici pour plus d'informations: How to extract img src, title and alt from html using php?

+0

"exactement un tag img sans autre balisage"? C'est un cas assez particulier n'est-ce pas, peut-être un peu trop spécifique pour presque tout le monde: [ – Andrew

1

Si vous devez utiliser lui-même preg_match(), essayer :

preg_match('/(?<!_)src=([\'"])?(.*?)\\1/',$content, $matches); 
Questions connexes