Ca y est, ça vient de me revenir.
T'as oublié l'option s qui permet au . de matcher aussi le caractère \n. Par défaut, les correspondances ne cherchent que sur la ligne courante (la première donc).
Y'a quand même un défaut... Par exemple, dans cette page :
Code HTML :
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Bidule</title>
</head>
<body id="index">
<div id="header">
<div id="banner">
</div>
<div id="ads">
</div>
<div id="menu">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/upload">Upload</a></li>
</ul>
</div>
</div>
<div id="contents"> </div>
<div id="footer">
© 2010 · bidule.com
<ul>
<li>Legal</li>
<li>About</li>
</ul>
</div>
</body>
L'expression régulière :
Code PHP :
preg_match('`<div id="header">(.*)</div>`s', $html, $matches);
Va récupérer le code HTML entre <div id="header"> et LE DERNIER </div> trouvé. C'est pas ça que tu veux... Il faudrait alors utiliser l'option U, pour que la PCRE ne soit pas gourmande... :
Code PHP :
preg_match('`<div id="header">(.*)</div>`sU', $html, $matches);
Mais là, elle va s'arrêter au PREMIER </div>, qui, dans mon exemple, est celui du div banner... C'est pas ça non plus que tu veux...
Si tu SAIS que le code HTML ne contient AUCUN autre div dans le header, alors ça ira (avec sU). Sinon, t'es obligé de parser le code de la page pour trouver le bon </div> (ligne par ligne, ou plutôt div par div).
--
Neige
Souvent la réponse à votre question se trouve dans la
doc. Commencez par là ;)