problème RegEx - récupérer le contenu de la balise avec classe donnée - preg_match (_all)
-
16-09-2019 - |
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?
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:- ...
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'attributclass
. - ...
>)(.*)<\/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.)