2009-08-14 7 views
0

Je dois récupérer le contenu de <p> tag avec classe donnée. Classe pourrait être simplecomment ou comment ...problème RegEx - récupérer le contenu de l'étiquette avec la classe donnée - preg_match (_all)

J'écrit le code suivant

preg_match("|(<p class=\"(simple)?comment(.*)?\">)(.*)<\/p>|ism", $fcon, $desc); 

Malheureusement, il ne renvoie rien. Cependant, si je supprime une partie de fin de tag (<\/p>) cela fonctionne en quelque sorte, en retenant la chaîne qui est trop longue (du début de la balise à la fin du document) ...

Quel est le problème avec mon expression régulière?

Répondre

2

Essayez d'utiliser un analyseur dom comme http://simplehtmldom.sourceforge.net/

Si je lis l'on pouvait faire quelque chose comme un exemple de code sur la page d'accueil de simplehtmldom correctement ce (comme les navigateurs font.):

$html->find('div.simplecomment', 0)->innertext = ''; 
+0

suggéré troisième des alternatives à Party [SimpleHtmlDom] (http://simplehtmldom.sourceforge.net/) qui utilisent réellement [DOM] (http://php.net/manual/en/book.dom.php) au lieu de String Parsing: [phpQuery ] (http://code.google.com/p/phpquery/), [Zend_Dom] (http://framework.zend.com/manual/en/zend.dom.html), [QueryPath] (http://querypath.org/) et [FluentDom] (http://www.fluentdom.org). – Gordon

0

La solution rapide est ici ce qui suit:

'|(<p class="(simple)?comment[^"]*">)((?:[^<]+|(?!</p>).)*)</p>|is' 

Changements:

  • La construction (.*) correspondra aveuglément tout, qui arrête l'expression régulière de travail, donc je l'ai remplacé les instances complètement avec des correspondances plus strictes:
    1. ... comment(.*)? ... – thi s va correspondre à tout ou rien, fondamentalement. Je l'ai remplacé avec ce [^"]* car qui correspondent à zéro ou plus non " caractères (en gros, il correspondra à la fermeture " caractère de l'attribut class.
    2. ... >)(.*)<\/p> ... – encore, cela correspondra aussi Je l'ai remplacé par un modèle efficace qui correspondra à tous les caractères non <, et une fois qu'il aura atteint <, il vérifiera s'il est suivi de </p>. la fin de la balise <p>), sinon elle continuera
  • J'ai enlevé le m flag car il n'a pas d'utilité dans cette expression régulière.

Mais il ne sera pas fiable (imaginez <p class="comment">...<p>...</p></p>, il correspondra <p class="comment">...<p>...</p>). Pour le rendre fiable, vous devrez utiliser des expressions régulières récursives ou (encore mieux) un analyseur HTML (ou XML si c'est le XHTML que vous avez à traiter.) Il existe même des bibliothèques qui peuvent gérer le HTML malformé « correctement »