|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Bonjour à tous,
Je souhaiterais coder une fonction PHP qui permettrait, dans une chaine HTML, de suffixer les abbreviations par leur définition placée entre parenthèses lors de la première occurrence trouvée, puis d'encapsuler les autres occurrences dans une balise <abbr>. Ce qui donnerait comme exemple si le glossaire contient la définition de l'abbreviation PHP : En entrée ce HTML : Code :
<p>Le langage PHP est super <a href="#" title="PHP"> découvrir PHP</a> car PHP c'est top.</p> Code :
<p>Le langage PHP (Hypertext Preprocessor) est super <a href="#" title="PHP"> découvrir <abbr title='Hypertext Preprocessor'>PHP</abbr></a> car <abbr title='Hypertext Preprocessor'>PHP</abbr> c'est top.</p> L'autre difficulté mais qui est moindre, est de traiter différemment la première occurrence de l'abbreviation par rapport aux suivantes. Enfin, concernant le glossaire, il s'agira d'un tableau PHP avec les abbreviations en clé et les définitions en valeur : Code :
$glossaire = array('PHP'=>'Hypertext Preprocessor', 'ABC'=>'Autre définition'); Merci d'avance ! |
|
|
00
|
|
|
#2 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Hello
Pas besoin de regexp pour ça, str_replace le fait très bien, la preuve: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
01
|
|
|
#3 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
Utilise plutôt strtr() ça évitera de créer deux traitements et tableaux temporaires inutiles...
[EDIT]Hmm, effectivement, ça n'a rien à voir avec le problème posé, désolé...[EDIT] |
|
|
00
|
|
|
#4 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Désolé j'avais mal lu ton post, effectivement c'est un poil plus complexe.
Voici comment tu peux procéder avec un closure: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
01
|
|
|
#5 |
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Merci Benjamin pour ce beau bout de code, seulement comme je le disais en début de topic, avec ce genre de code on va se retrouver avec des abbr dans les title et les alt...
|
|
|
00
|
|
|
#6 | ||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
Voilà un premier jet avec assertions :
Code :
|
||
|
|
00
|
|
|
#7 | ||
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Enorme merci !
J'ai juste modifié un peu pour coller au contexte, c'est à dire que le title de la balise abbr doit contenir la definition du mot. Donc ça donne : Code :
J'ai compris la partie implode('|'....) qui consiste à capturer tous les termes que l'on veut remplacer par des abbreviations, mais ce que tu as mis avant et après ça signifie quoi exactement ? Merci encore en tout cas, j'ai gagné un temps fou grâce à ton aide ! |
||
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
A la base c'est un vieux pattern que j'ai repris et modifié que j'avais chopé je ne sais où mais je m'aperçois que le pattern ne réagit pas tout à fait comme je le pensais.
est censé matcher, je crois, PHP ou ABC non-précédé de '<' qui est suivi de n'importe quel caractère différent de '<' (en mode ungreedy avec le *?) mais normalement ça devrait être une assertion arrière et non pas une assertion avant et qui me semble inutile car le HTML est censé être bien formé. Et il faut ajouter un délimiteur de mot (\b) pour ne pas remplacer par exemple 'PHPTRUC' ou autre. Au final je pencherais plutôt pour ceci : qui matche les mots PHP et ABC s'ils sont suivis de rien ou de la séquence 'XXXX<' mais pas 'XXXX>'. Enfin, je t'avoues que c'est pas super clair non plus dans ma tête (Je me demande si c'est exprimable avec une assertion positive avant, si quelqu'un passe dans le coin |
|
|
00
|
|
|
#9 | |
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Citation:
J'essaye ton second jet de regex demain matin |
|
|
|
00
|
|
|
#10 | |
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Citation:
Mais sinon la première que tu m'a donné fonctionne plutôt bien on dirait, pourquoi la trouvais-tu mauvaise ? |
|
|
|
00
|
|
|
#11 | ||
![]() ![]() Benjamin PREVOTArchitecte de système d'information Inscription : septembre 2004 Messages : 1 568 ![]() |
Bonjour,
Ce code semble répondre à ta demande Code :
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN F.A.Q. : Java, PHP, (X)HTML / CSS N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème |
||
|
|
00
|
|
|
#12 |
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Bonjour,
Merci pour ton aide mais en fait le besoin est de remplacer une première fois le terme par "terme (définition)" et d'encapsuler les occurrences suivantes dans une balise ABBR. Ainsi lorsque tu lira le texte, la première occurrence de PHP sera expliquée entre parenthèse juste après le mot PHP, et toutes les autres occurrences de PHP dans la page seront encapsulées dans une balise <abbr>. |
|
|
00
|
|
|
#13 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
A mon avis on va se creuser la soupière encore longtemps avec ton code...
C'est vraiment tordu comme besoin.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
01
|
|
|
#14 |
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Tout à fait d'accord, c'est un besoin qui n'a pas été pensé pour le développeur
Bon mais pour résumer cette solution donnée plus haut semble fonctionner : Code :
var_dump(preg_replace_callback('`(?!<[^<]*?)('.implode('|', array_keys($glossaire)).')(?![^<]*?>)`', 'callback', $str)); Code :
<a href="ICI JE CAPTURE PAS" alt="ICI NON PLUS">ICI JE CAPTURE</a> |
|
|
00
|
|
|
#15 | |||
|
Membre Expert
![]() Inscription : février 2005 Messages : 1 791 ![]() |
Citation:
Mon autre interrogation était plutôt sur les perfs car la première assertion me semble inutile, à moins qu'elle ne joue sur les perfs en limitant la recherche mais là, je ne sais pas. Bizarre que le 2e pattern plante, je l'avais testé. Est-ce que tu l'avais bien utilisé de cette manière : Code :
|
|||
|
|
00
|
|
|
#16 | ||
![]() ![]() Benjamin PREVOTArchitecte de système d'information Inscription : septembre 2004 Messages : 1 568 ![]() |
Bonjour,
J'ai trouvé sympa ce petit problème, alors je me suis un peu attardé dessus Voilà ce que je pensais faire Code :
__________________
Si vous ne pouvez expliquer un concept à un enfant de six ans, c'est que vous ne le comprenez pas complètement. Albert EINSTEIN F.A.Q. : Java, PHP, (X)HTML / CSS N'oubliez pas de cliquer sur le bouton Résolu en bas de page quand vous avez obtenu une solution à votre problème |
||
|
|
00
|
|
|
#17 | |
|
Membre confirmé
![]() Inscription : septembre 2005 Messages : 724 ![]() |
Citation:
Merci ton code marche très bien et je découvre au passage l'existence ainsi que le fonctionnement de preg_split ! ![]() ![]() ![]() ![]() Un grand merci général à tous ceux qui m'ont aidé sur ce post, j'ai maintenant deux solutions qui marchent très bien, c'est grâce à vous ! |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com