|
Publicité | ||||||||||||||||||||||
|
|
#1 |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
Bonjour,
j'utilise la manip suivante pour modifier mes textes Code :
function affiche_texte_auto_lien ($texte) { $texte = stripslashes ($texte ) ; $texte = ereg_replace ("arbitre", "<strong><a href=\"../arbitres/arbitre.php\">arbitre</a></strong>" , $texte) ; print (nl2br($texte)) ; return ($texte) ; } En revanche, avec foot. et foot, rien ne se passe à cause des signes de ponctuation qui suivent. Est-il possible de lui faire reconnaître les mots complets, et non pas les morceaux de mots et de permettre une reconnaissance même si le mot est suivi d'une virgule, d'un point etc... ? Par avance, merci de votre aide. |
|
|
|
|
|
#2 |
|
Membre expérimenté
![]() Date d'inscription: mai 2006
Localisation: Hong Kong
Âge: 31
Messages: 523
|
utilise plutot un preg_replace
voila la regexp (vite fait) Code :
[^0-9,a-z]arbitre[^0-9,a-z] |
|
|
|
|
|
#3 |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
Merci bien pour cette piste.
Si ce n'est pas trop abuser, ça donne quoi sur un cas concret comme : Code :
$texte = ereg_replace ("arbitre", "<strong><a href=\"../arbitres/arbitre.php\">arbitre</a></strong>" , $texte) ; |
|
|
|
|
|
#5 |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
Voilà une réponse qui ouvre encore de nouveaux horizons.
Merci vraiment beaucoup ! Rectification : j'ai rien comprendu à cette usine à gaz. Si quelqu'un a la solution à mon pb,... ! Dernière modification par php_de_travers ; 12/05/2006 à 18h50. |
|
|
|
|
|
#6 |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
Par hasard, je viens de trouver ça :
Code :
<?php $ch='Bon alors voilou, la bonne méthode consiste à limiter les mots de façon à éviter de prendre une partie, comme sol dans solide, bravo dans bravoure et bon dans bonne comme au début, même si BRAVO ou BON sont en majuscules ou encore un mix des deux et au pluriel comme BrAVoS.'; $mot=array('bravo','bon','sol'); $motif='`\b(('.implode('|',$mot).')s?)\b`si'; $sortie='<span style="background-color:#ffcc00">$1</span>'; echo preg_replace($motif,$sortie,$ch); ?> |
|
|
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() Date d'inscription: septembre 2004
Messages: 5 462
|
Code :
$texte = preg_replace ('/\barbitre\b/', "<strong><a href=\"../arbitres/arbitre.php\">arbitre</a></strong>" , $texte) ; |
|
|
|
|
|
#8 |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
Merci pour ta réponse précise à ma question.
Une recherche approfonfie sur le web et pas mal d'expérimentation empirique me permettent de proposer ce qui suit. Code :
<?php $paragraphe ='Dans les années 70, l'équipe de football de Saint-Etienne a fait rêver des milliers de supporters. Sait-on si notre Zizou national n'est pas la concrétisation de ce rêve.'; function affiche_texte_auto_lien ($texte) { $texte = preg_replace('`\b(('.football.')s?)\b`si','<strong><a href="../football.php">$1</a></strong>',$texte); $texte = preg_replace('`\b(('.zizou.')s?)\b`si','<strong><a href="../zinedine-zidane.php">$1</a></strong>',$texte); $texte = preg_replace('`\b(('.millier.')s?)\b`si','<strong><a href="../nombres.php">$1</a></strong>',$texte); print (nl2br($texte)) ; } $paragraphe = affiche_texte_auto_lien ($paragraphe) ; ?> Le hic, ce sont les mots composés : Saint Etienne est refusé. |
|
|
|
|
|
#9 |
![]() Date d'inscription: février 2004
Localisation: Yonne
Messages: 13 776
|
Salut
Il y a de sérieux problèmes à ta regex :/ Tu concatènes la constante football à la regex mais, puisqu'elle n'existe pas, PHP la convertit en chaîne littérale donc ça marche. Mais ça devrait pas. Normalement, tu devrais avoir un joli Warning à ce sujet : j'imagine que tu as enlevé l'error_reporting dans ton php.ini. Solution : remplacer Code :
('.football.') Code :
(football)
__________________
Mes articles - Mon blog - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
|
|
#10 |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
La proposition de Mr. N est excellent pour les mots composés :
Code :
$texte = preg_replace ('/\bSaint Etienne\b/', "<strong><a href=\"../les-verts.php\">Saint Etienne</a></strong>" , $texte) ; '`\b(('.millier.')s?)\b`si' Ca sert à reconnaître la version au pluriel d'un mot proposé initialement au singulier. Mais je ne sais pas du tout comment ça fonctionne... PS : comment faites-vous pour maîtriser des trucs pareils, les modérateurs et autre participants à ce forums ? |
|
|
|
|
|
#11 |
![]() Date d'inscription: février 2004
Localisation: Yonne
Messages: 13 776
|
Le s permet de dire à ton point (dans l'expression) qu'il doit aussi remplacer les sauts de line ("\n" et compagnie). Donc si tu n'as pas de point dans ta regex, tu n'as pas besoin du modificateur s.
Le i permet d'ignorer la casse (majuscules == minuscules). Le point d'interrogation ? permet de matcher, que le caractère soit là ou non. On peut l'appliquer comme l'étoile * (zéro jusqu'à l'infini) et le plus + (au moins un). Lis bien la doc PHP sur les regex, tout y est expliqué. C'est à force...
__________________
Mes articles - Mon blog - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() Date d'inscription: septembre 2004
Messages: 5 462
|
Je dis que le s c'est pour un millier, des milliers
|
|
|
|
|
|
#13 | |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
De plus en plus tordu !
J'ai plusieurs mots qui génèrent ce genre de mis en valeur automatique : - zizou - Platini - joueurs - etc... Code :
<?php $texte = "Quelques joueurs français connus internationalement : Michel Platini, Zinédine Zidane, dit Zizou" ; $texte = preg_replace('`\b(('.zizou.')s?)\b`si','<strong><a href="../joueur/index.php">$1</a></strong>',$texte); $texte = preg_replace('`\b(('.platini.')s?)\b`si','<strong><a href="../joueur/joueur.php">$1</a></strong>',$texte); $texte = preg_replace('`\b(('.joueur.')s?)\b`si','<strong><a href="../joueur/index.php">$1</a></strong>',$texte); print $texte ; ?> Résultat qui se mord la queue : Citation:
|
|
|
|
|
|
|
#14 | |
![]() Date d'inscription: février 2004
Localisation: Yonne
Messages: 13 776
|
Hmmm, comment dire...
Cela ne t'a pas mis la puce à l'oreille ? Un langage de script (comme PHP) n'est pas prévu pour effectuer des tâches trop spécifiques. Si tu répètes une tâche spécifique en changeant peu de choses (c'est le cas pour cette regex), alors peut-être qu'il serait plus intéressant de revoir la structure de ton site. En l'occurence, je trouve assez peu judicieux d'avoir une page "zidane.php" : j'aurais essayé de me situer au niveau de la classe plutôt que de l'objet, pour parler en termes de prog orientée objet. Exemple : "Zidane" est un joueur de foot. Il n'est probablement pas exclu que tu ajoutes d'autres joueurs par la suite, donc pourquoi ne pas nommer ton script "joueurs.php" et lui donner un paramètre "nom=Zidane" ? Ou bien tu places le tout dans un répertoire joueurs/ et le script d'appelle index.php. Finalement, ta regex aura quelque chose comme ceci à remplacer : Citation:
__________________
Mes articles - Mon blog - Zend Certified Engineer (PHP + Zend Framework) Ressources PHP - Ressources Zend Framework |
|
|
|
|
|
#15 |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
J'ai enfin trouvé une solution :
Code :
$texte = "Quelques joueurs français connus internationalement : Michel Platini, Zinédine Zidane, dit Zizou." ; $texte = preg_replace('`\b(('.joueur.')s?)\b`si','<strong><a href="../joueur/index.php">$1</a></strong>',$texte); $texte = preg_replace('`\b(('.zizou.')s?)\b`si','<strong><a href="../joueur.php">$1</a></strong>',$texte); $texte = preg_replace('`\b(('.platini.')s?)\b`si','<strong><a href="../joueur/joueur.php">$1</a></strong>',$texte); print $texte ; Je ne sais pas pourquoi, mais ça marche. NB : ça marche pour les mots isolés, pas les groupes de mots ("Marius Trésor"). Dernière modification par php_de_travers ; 14/05/2006 à 22h03. |
|
|
|
|
|
#16 | |
|
Membre éprouvé
![]() Date d'inscription: juin 2004
Messages: 445
|
Citation:
la nouvelle version de la procédure est : $texte = preg_replace('`\b((joueur)s?)\b`si','<strong><a href="../joueur/index.php">$1</a></strong>',$texte); Et elle fonctionne très bien. |
|
|
|
|
|
|
![]() |
||
Lien automatique
|
||
| Outils de la discussion | |
|
|