problème RegEx - récupérer le contenu de la balise avec classe donnée - preg_match (_all)

StackOverflow https://stackoverflow.com/questions/1277422

Question

Je dois récupérer le contenu de la balise de <p> avec classe donnée. pourrait être simplecomment ou comment classe ...

J'écrit le code suivant

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

Malheureusement, il ne retourne rien. Toutefois, si j'enlève une balise de fin partie (<\/p>), il fonctionne en quelque sorte, returing la chaîne qui est trop long (depuis le début de la balise à la fin du document) ...

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

Était-ce utile?

La solution

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

Si je lis le code exemple sur la page d'accueil de simplehtmldom correctement vous pourriez faire quelque chose comme ceci:

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

Autres conseils

La solution rapide est ici ce qui suit:

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

Modifications:

  • Le (.*) de construction va juste correspondre aveuglément tout ce qui arrête l'expression régulière de travail, donc je l'ai remplacé les cas complètement avec des allumettes plus strictes:
    1. ... comment(.*)? ... - cela correspond tout ou rien, au fond. Je l'ai remplacé cela avec [^"]* puisque cela correspond à zéro ou plusieurs caractères non-" (essentiellement, il correspondre au caractère " de clôture de l'attribut class.
    2. ... >)(.*)<\/p> ... - encore une fois, cela correspondra trop. Je l'ai remplacé avec un modèle efficace qui correspond à tous les caractères non-<, et une fois qu'il frappe un < il vérifiera si elle est suivie par </p>. Dans ce cas, il arrêtera correspondant (puisque nous sommes à la fin de la balise <p>), sinon il continuera.
  • J'ai enlevé le drapeau m car il n'a pas utilisé 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 aurez besoin d'utiliser des expressions régulières récursives ou (encore mieux) un analyseur HTML (ou XML si elle est XHTML que vous avez affaire.) Il y a même des bibliothèques là-bas qui peuvent gérer malformé HTML " correctement »(comme les navigateurs font.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top