OVH Cloud OVH Cloud

Expresion reguliere : exclure une chaine de caractaires

3 réponses
Avatar
BillyNoGates
Bonjour,

Je cherche =E0 extraire les differents formulaires d'une page html.
j'ai deja prepar=E9 une expression reguliere mais elle ne fonctionne pas
tr=E8s bien dans le cas ou la page possede plusieur formulaire car elle
n'exclus pas la chaine de caractaire '<form'.

Voici mon expression : <form[^>]*>(.*)[^<]*</form>

Quelqu'un sait t'il comment je pourais fair pour exclure une chaine de
caractaires d'une expression (par exemple la chaine "<form") ?

Merci d'avance

3 réponses

Avatar
Paul Gaborit
À (at) 12 Oct 2005 02:27:49 -0700,
"BillyNoGates" écrivait (wrote):
Je cherche à extraire les differents formulaires d'une page html.
j'ai deja preparé une expression reguliere mais elle ne fonctionne pas
très bien dans le cas ou la page possede plusieur formulaire car elle
n'exclus pas la chaine de caractaire '<form'.

Voici mon expression : <form[^>]*>(.*)[^<]*</form>

Quelqu'un sait t'il comment je pourais fair pour exclure une chaine de
caractaires d'une expression (par exemple la chaine "<form") ?


Pour cette dernière question: on ne peut pas.

Votre expression est en fait équivalente à :

<form[^>]*>(.*)</form>

Comme les éléments 'form' ne sont pas imbricables, vous pouvez
utiliser les quantificateurs non gourmands :

<form[^>]*>(.*?)</form>

J'imagine que vous utilisez les modificateurs m/.../is pour ne pas
être perturbé par les passages à la ligne et l'usage de
majusucles/minuscules.

Mais le seule vraie bonne solution est d'utiliser un vrai parseur de
(HTML|XML). Il en existe beaucoup sous forme de modules. Certains sont
écrits en Perl pur. Cela vous garantira une extraction parfaite dans
*tous* les cas. Comme celui-ci par exemple :

<form ...>
...
<!-- </form> -->
...
</form>

qui est un formulaire tout à fait valide (si on remplace les ... par
ce qui va bien) mais que votre expression ne saura pas extraire
convenablement (à cause du commentaire HTML).

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Paul Gaborit
À (at) Wed, 12 Oct 2005 11:57:08 +0200,
Paul Gaborit écrivait (wrote):
Quelqu'un sait t'il comment je pourais fair pour exclure une chaine de
caractaires d'une expression (par exemple la chaine "<form") ?


Pour cette dernière question: on ne peut pas.


Pour être plus correct, on peut le faire mais ce n'est ni efficace ni
lisible dans le cas qui vous intéresse. Jugez plutôt :

<form[^>]*>((?:.*(?!</forms*>))*.)</forms*>

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
BillyNoGates
Merci beaucoup pour vos réponses, je pense effectivement que je vais
diriger mes recherche vers un parser HTML.