Je suppose que mon cas est trivial, malheureusement ça fait plusieurs années que je n'ai pas pratiqué les expressions rationnelles et du coup, j'ai un peu perdu la main.
Tout le code se trouve sur http://pastebin.com/m3398f5c6
J'ai l'intention de créer une expression pour enlever la balise html qui contient un attribut dont le mot-clé est "language" et la valeur "fr", ainsi que le contenu délimité par ces balises (dans cet exemple, faire sauter la deuxième ligne, tout simplement).
Évidemment, il est possible que dans la balise html soit insérée d'autres attributs, dans n'importe quel ordre. De même, la recherche se fait en multi-lignes (/s), et d'autres langues seront peut-être ajoutées par la suite.
Donc j'avais écrit la première tentative, ce qui va manger également la première ligne, puisque la recherche se concentre sur "
# txt2regex
Posté par NeoX . Évalué à 1.
^< h1.*language="fr".* >.*< /h1 >
[^] # Re: txt2regex
Posté par Grégory SCHMITT . Évalué à 1.
- la recherche se fait en mode gourmand alors que je veux du non-gourmand;
- je n'ai jamais dit que le contenu figurait toujours en début de ligne (d'où le ^).
Le code que j'ai fourni n'est qu'un exemple extrait d'un fichier qui contient beaucoup d'autres lignes du même type (attribut language avec d'autres balises).
Mais ton code m'a donné une autre idée...
# Trouvé !
Posté par Grégory SCHMITT . Évalué à 1.
J'ai rajouté la solution en tant que dernière ligne.
# Langage non régulier
Posté par Obsidian . Évalué à 4.
Évidemment, il est possible que dans la balise html soit insérée d'autres attributs, dans n'importe quel ordre. De même, la recherche se fait en multi-lignes (/s), et d'autres langues seront peut-être ajoutées par la suite.
Tu mets-là le doigt sur un célèbre cas d'école en informatique théorique : les langages récursifs ne sont pas réguliers, et donc ne peuvent pas être reconnus de manière universelle par les expressions régulières. Tu rencontreras le problème à partir du moment où des balises encadront d'autres balises de même nature − typiquement « <div> » − car tu pourras extraire soit la paire la plus profonde, soit l'imbrication toute entière, mais pas t'arrêter à la balise fermante qui correspondra à celle que tu auras trouvée.
Cela est dû au fait qu'il te faut compter le nombre de sous-balises ouvrantes pour t'arrêter à la bonne ensuite et que, pour cela, il te faut un registre. Le moyen le plus simple d'y parvenir est l'utilisation d'une pile.
Voir Hierarchie_de_Chomsky.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.