D'abord, je voudrais utiliser la méthode group()
pour récupérer le texte correspondant, non toString()
. Mais c'est probablement juste la partie URL que vous voulez, donc j'utiliserais des parenthèses pour capturer cette partie et appeler group(1)
pour le récupérer. Deuxièmement, je ne supposerais pas src
était le premier attribut de la balise <img>
. Sur SO, par exemple, il est généralement précédé d'un attribut class
. Vous voulez ajouter quelque chose pour correspondre aux attributs intermédiaires, mais assurez-vous qu'il ne peut pas correspondre au-delà de la fin de la balise. [^<>]+
suffira probablement. Troisièmement, j'utiliserais quelque chose de plus restrictif que .*
pour faire correspondre la partie inconnue avec le chemin. Il y a toujours une chance que vous trouverez deux URL sur une ligne, comme ceci:
<img src="http://so.com/foo.jpg"> blah <img src="http://so.com/bar.jpg">
Dans ce cas, le .*
dans votre regex combler l'écart, vous donnant un match où vous vouliez deux. Encore une fois, [^<>]*
sera probablement assez restrictif.
Il existe également plusieurs autres problèmes potentiels. Les valeurs d'attribut sont-elles toujours entourées de guillemets, ou pourraient-elles être à guillemets simples ou ne pas être du tout citées? Y aura-t-il des espaces autour du =
? Les noms d'éléments et d'attributs sont-ils toujours en minuscules?
... et je pourrais continuer. Comme cela a été souligné à plusieurs reprises ici sur SO, les expressions régulières ne sont pas vraiment le bon outil pour travailler avec HTML. Ils peuvent généralement gérer des tâches simples comme celle-ci, mais il est essentiel que vous compreniez leurs limites.
Voici ma version révisée de votre regex (comme chaîne littérale Java):
"(?i)<img[^<>]+src\\s*=\\s*[\"']?(http://stackoverflow\\.com/[^<>]+\\.jpg)"
Peut-être parce qu'il est en fait Stackoverflow avec un '' K' au lieu de h'? ;) En outre, la bonne approche serait d'utiliser un analyseur HTML: http://stackoverflow.com/search?q=parse+html+with+regex – BalusC
Ceci est un problème qui est bien dans les limites de regex, beaucoup de L'analyse HTML n'est pas adaptée à la regex, mais je ne vois pas de problème à extraire un chemin d'image de cette manière. – Michael
@Michael: '' pourrait devenir un problème, en fonction de ce que l'expression rationnelle est utilisée pour ... –