2010-06-01 10 views
5

Ceci est mycodePhp expression régulière pour correspondre à une div

<?php 

/** 
* @author Joomlacoders 
* @copyright 2010 
*/ 
    $url="http://urlchecker.net/html/demo.html"; 

    $innerHtml=file_get_contents($url); 

    //echo $innerHtml; 
    preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches); 

      //<div id='news-id-160346'>    

    var_dump($matches); 

?> 

Je veux trouver tout le contenu div id = 'nouvelles id-160346. S'il vous plaît aidez-moi

Répondre

6

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

?> 
+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

+1

@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

+0

Je l'ai essayé mais ce code ne correspond pas à tout le contenu de id = 'news-id-160346' – Thoman

0

Utilisez un analyseur comme suggéré.

Ou essayez cette regex:

preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches); 
print_r($matches); 

Vérifiez la sortie de la déclaration print_rde comprendre pourquoi regex est pas considéré comme le bon outil pour l'analyse syntaxique html.

+0

Not match, s'il vous plaît le corriger – Thoman

+0

@Thoman Lire ma dernière ligne à nouveau. Il ne correspondra pas - c'est tout le point - il ne peut pas être réparé. – Amarghosh

+0

Vous voulez expliquer pourquoi il a été déclassé? – Amarghosh

Questions connexes