Use an HTML parser. NOT regular expressions.
Le problème avec des expressions régulières est qu'ils ne peuvent pas correspondre à des structures imbriquées. En supposant que votre regex doit correspondre à une seule <div>
et sa balise de fermeture, il n'y a pas moyen de faire correspondre correctement cette entrée:
<div id="a">
<div id="b">
Foo
</div>
</div>
<div id="c">
Bar
</div>
Parce que si l'expression régulière est gourmand, il correspondra à deux divs supérieurs, et si elle est ungreedy , il ne correspondra pas à l'étiquette de fin correcte.
Par conséquent, vous devez utiliser un analyseur HTML. Avec PHP, DOMDocument::loadHTML
ou DOMDocument::loadHTMLFile
chacun fait un assez bon travail. (Vous pouvez "ignorer" en toute sécurité les avertissements qu'il génère: ils ne sont que des erreurs de balisage, et l'objet DOMDocument
généré devrait être plutôt correct.)
Comme le PHP getElementById est pénible à mettre au travail, vous pouvez utiliser DOMXpath dans le même but:
<?php
$url = "http://urlchecker.net/html/demo.html";
$d = new DOMDocument();
$d->loadHTMLFile($url);
$xpath = new DOMXPath($d);
$myNews = $xpath->query('//@id="news-id-160346"')->item(0);
?>
Bonjour je fait essayer toute réponse, mais pas avec succès Avertissement: DOMDocument :: loadHTMLFile() [domdocument.loadhtmlfile]: balise de fin inattendue: un dans http://urlchecker.net/html/demo.html, ligne: 26 dans /home/urlcheck/public_html/html/test.php à la ligne 10 – Thoman
@Thoman: c'est en fait un succès. loadHTMLFile vous indique simplement les problèmes rencontrés lors de l'analyse. Vous pouvez le fermer avec l'opérateur '@': '@ $ d-> loadHTMLFile ($ url);' – zneak
Je l'ai essayé mais ce code ne correspond pas à tout le contenu de id = 'news-id-160346' – Thoman