2009-10-15 7 views
0

Je suis en train de faire correspondre les attributs d'une balise html, mais je ne peux pas le faire fonctionner :)PHP regex backreference

Prenons cette balise par exemple:

<a href="ddd" class='sw ' w'> 

Il est évident que la dernière partie n'est pas tout à fait raison.

Maintenant, j'essayé de faire correspondre les attributs partie avec ce morceau de code:

preg_match('/(\s+\w+=(?P<quote>(\'|\"))[^(?P=quote)]*(?P=quote))*/U', " href=\"bla\" class='sw'sw'", $a); 

$ Voici un est vide, et c'est ce que je pense. Mais si je prends maintenant mon expression complète correspondent à la dernière partie de la classe, ce qui me laisse perplexe. Il ressemble à ceci:

preg_match('/<(?P<c>[\/]?)(?P<tag>\w+)(?P<atts>(\s+\w+=(?P<quote>(\'|\"))[^(?P=quote)]*(?P=quote))*)\s*(?P<sc>[\/]?)>/U', $tag, $a); 

maintenant $ un rendement:

Array 
(
[0] => <a href="ddd" class='sw ' w'> 
[c] => 
[1] => 
[tag] => a 
[2] => a 
[atts] => href="ddd" class='sw ' w' 
[3] => href="ddd" class='sw ' w' 
[4] => class='sw ' w' 
[quote] => ' 
[5] => ' 
[6] => ' 
[sc] => 
[7] => 
) 

Avis sur la touche 4 qui contient la partie de la classe, y compris la dernière « w, alors que je l'ai fait utiliser la carte (U) Interrupteur ngreedy à la fin.

Des indices?

Répondre

1

C'est vraiment une mauvaise idée d'essayer et regex HTML - il y a un DOM Inspector pour PHP qui peut le faire.

+0

Je sais, mais je corrige un exis bibliothèque de ting. – acidtv

+0

Tenter de réparer une mauvaise pratique est en soi une mauvaise pratique. Au lieu d'essayer de réparer l'expression, remplacez-la par un gestionnaire DOM - vous obtiendrez vos données et il y a de fortes chances qu'elles ne se brisent pas avec les variances dans les balises qui y sont ajoutées. – squeeks

+0

hmm ok, je vais y jeter un coup d'oeil. – acidtv

0

[^ (? P = citation)]

Vous ne pouvez pas faire cela. Les classes de caractères contiennent uniquement des caractères uniques, des barres obliques inverses et des plages -; cette classe de caractères correspond à l'un des caractères littéraux (, ), ?, P et ainsi de suite.

De plus, (?P=quote) n'est pas une référence arrière, c'est une expression récursive. Il prend la regex de la définition précédente:

(?P<quote>(\'|\")) 

et correspond donc soit »ou« quelle que soit la citation a été utilisée au début de la valeur d'attribut Backrefs sont faites avec des expressions comme \1 correspondant au numéro () groupe de correspondance.

Mais de toute façon, squeeks a raison: analyser [X] [HT] ML avec regex est un jeu à perte totale Vous ne trouverez jamais une expression qui traite correctement tous les balisages possibles. XML ou HTML parser

+0

Ok, mais ce que vous avez dit sur (? P = quote) n'étant pas une référence arrière, je ne trouve rien à ce sujet dans la documentation. Ce que je peux trouver est: "Les références arrières aux sous-modèles nommés peuvent être obtenues par (? P = nom)", et "Une référence arrière correspond à tout ce qui correspondait réellement au sous-modèle de capture dans la chaîne sujet en cours, plutôt que sous-masque lui-même. " Pouvez-vous expliquer cela?J'essaie d'apprendre ici :) – acidtv