Pattern sur expression rationnelles

Petit nouveau ! | 3 Messages

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.

ViPHP
AB
ViPHP | 5818 Messages

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.

Petit nouveau ! | 3 Messages

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 @+ ;)

ViPHP
ViPHP | 4674 Messages

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 :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Petit nouveau ! | 3 Messages

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 @+ ;)