Page 1 sur 1

Pattern sur expression rationnelles

Posté : 14 déc. 2008, 19:05
par campton-dei
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.

Posté : 15 déc. 2008, 00:00
par AB
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.

Posté : 15 déc. 2008, 10:05
par campton-dei
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 @+ ;)

Posté : 15 déc. 2008, 18:21
par Hywan
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 :).

Posté : 15 déc. 2008, 18:44
par campton-dei
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 @+ ;)