Pattern sur expression rationnelles

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Pattern sur expression rationnelles

par campton-dei » 15 déc. 2008, 18:44

Re les gens,
Hey :),

Ton expression régulière analyse bien une balise (même si je n'ai pas regardé les effets de bords ou cas particuliers), mais pense qu'elle peut-être dans un ensemble d'autres balises. Par exemple :

Code : Tout sélectionner

<p>J'ai <em>vraiment</em> eu du mal à mon examen de Théorie des Langages.</p>
Ici, tu vas perdre de l'information normalement.

Une expression régulière donnée dans les RFC (et autres documentations sérieuses) pour analyser et faire correspondre (pattern matching) une chaîne HTML (pas sûr que ce soit strictement réservé à l'XML car il y a des différences) est :

Code : Tout sélectionner

#([^>]+)?<([\w]+)(\s?[^>]*)(?(?<!(?:[/\s?]))>(.*?)(?:</\2>)+|>?)([^<]+)?#Ss
Exploitable avec la fonction PHP preg_match_all(). Un exemple :
// 0. captured string ;
// 1. previous tag string ;
// 2. tag ;
// 3. attributes and values ;
// 4. tag content ;
// 5. next tag string.
//               1        2        3                        4                   5
$pattern  = '#([^>]+)?<([\w]+)(\s?[^>]*)(?(?<!(?:[/\s?]))>(.*?)(?:</\2>)+|>?)([^<]+)?#Ss';
$out      = '';
if(preg_match_all($pattern, $string, $substring, PREG_SET_ORDER)) {
J'ai un tout petit peu retoucher l'expression par rapport à l'originale qui ne fait que la reconnaissance. Si on veut analyser la chaîne, on peut passer certains passages sous silence (d'où les ?:).

C'est la façon la plus fine d'exploiter une chaîne HTML. On a tous les détails possibles.

À étudier :).
Je te remercie d'avoir donné de ton temps pour réponde.
Je prends note de tes remarques et vais m'empresser de tester.

Encore merci :-)

A bientôt les gens @+ ;)

par Hywan » 15 déc. 2008, 18:21

Hey :),

Ton expression régulière analyse bien une balise (même si je n'ai pas regardé les effets de bords ou cas particuliers), mais pense qu'elle peut-être dans un ensemble d'autres balises. Par exemple :

Code : Tout sélectionner

<p>J'ai <em>vraiment</em> eu du mal à mon examen de Théorie des Langages.</p>
Ici, tu vas perdre de l'information normalement.

Une expression régulière donnée dans les RFC (et autres documentations sérieuses) pour analyser et faire correspondre (pattern matching) une chaîne HTML (pas sûr que ce soit strictement réservé à l'XML car il y a des différences) est :

Code : Tout sélectionner

#([^>]+)?<([\w]+)(\s?[^>]*)(?(?<!(?:[/\s?]))>(.*?)(?:</\2>)+|>?)([^<]+)?#Ss
Exploitable avec la fonction PHP preg_match_all(). Un exemple :
// 0. captured string ;
// 1. previous tag string ;
// 2. tag ;
// 3. attributes and values ;
// 4. tag content ;
// 5. next tag string.
//               1        2        3                        4                   5
$pattern  = '#([^>]+)?<([\w]+)(\s?[^>]*)(?(?<!(?:[/\s?]))>(.*?)(?:</\2>)+|>?)([^<]+)?#Ss';
$out      = '';
if(preg_match_all($pattern, $string, $substring, PREG_SET_ORDER)) {
J'ai un tout petit peu retoucher l'expression par rapport à l'originale qui ne fait que la reconnaissance. Si on veut analyser la chaîne, on peut passer certains passages sous silence (d'où les ?:).

C'est la façon la plus fine d'exploiter une chaîne HTML. On a tous les détails possibles.

À étudier :).

par campton-dei » 15 déc. 2008, 10:05

Bonjour,
J'ai pas regardé plus que ça mais attention toutefois si tes chaines sont au format utf-8. Le premier chapitre de ce lien http://www.phpwact.org/php/i18n/utf-8 t'en dira plus.
Merci pour ta réponse: le lien est interessant même s'il n'entre pas, directement, en relation
avec mon post je suis ravi que tu ais pris quelques instants pour y répondre.
Si ton temps le permet, et si tu regardes plus attentivement le pattern, un retour serait aprécié.

Merci encore, bonne journée @+ ;)

par AB » 15 déc. 2008, 00:00

J'ai pas regardé plus que ça mais attention toutefois si tes chaines sont au format utf-8. Le premier chapitre de ce lien http://www.phpwact.org/php/i18n/utf-8 t'en dira plus.

Pattern sur expression rationnelles

par campton-dei » 14 déc. 2008, 19:05

Bonjour les gens,

Ceci n'est pas vraiment une question.
Je souhaite vous soumettre un pattern de recherche afin
que vous me donniez votre avis. Il me semble correct mais,
peut-être, l'auriez-vous traité autrement?.

il parse une chaine de type: <TAG> [ID="Chaine" *]

Code : Tout sélectionner

$match = array(); $pattern = "#^[\S]*?|(( [\w+].*)[=| ].*\"(.*))\"#Uis"; $string = "TAGNAME id=\"MyId\" class=\"MyClass\" date=\"14-12-2008\""; $iCount = preg_match_all($pattern, $string, $match);
Le TAG est toujours en offset 0.0
Les éléments sont disposés en tableau logique [x][0] = NULL
une simple fonction modulo %4 permet de les récuperer

Désolé si je ne suis pas dans la bonne catégorie et par avance merci.

-everal-die-

@+ les gens.