Page 1 sur 1

preg_replace ne tenant pas compte du lettrage

Posté : 09 juin 2006, 20:30
par Elie
Bonjour.

Je cherche en vain comment remplacer du texte contenant le meme mot ecris differament.

Je souhaiterais transformer :

Code : Tout sélectionner

Linux<br />LiNuX<br />linuX
avec ce genre de resultat :

Code : Tout sélectionner

<a href="http://www.unlienquejindique.com" alt="Liens vers %s">%s</a>
Et cela en gardant la facon dont le mot est "ecrit".

J'ai tester d'inserer des choses comme \\1 pour recuperer le mot, mais comment recuperer le mot dans la lettrine qu'il est ?

J'espere avoir ete assez clair.

Merci, Elie

Posté : 09 juin 2006, 21:00
par Invité
Heu... je ne sais pas si j'ai compris juste... :roll:
$var = "LiNuX"; // ou Linux ou LINUX, etc...
$var = preg_replace("!linux!i", "<a href=\"http://www.unlienquejindique.com\" alt=\"Liens vers $0\">$0</a>", $var);
echo $var;

Posté : 09 juin 2006, 21:11
par Elie
Tu dechires !

Merci beaucoup !

Posté : 09 juin 2006, 21:13
par Ryle
Comme cela t'a été illustré dans l'exemple précédent, c'est effectivement l'attribut "i" qu'il faut utiliser à la fin de ton pattern pour le rendre insensible à la casse des lettres (majuscules/minuscules)

Posté : 09 juin 2006, 21:47
par Sineljogy
C'était moi au cas où ^^

J'avais oublié de me connecter :oops:

De rien Elie ;)

Posté : 10 juin 2006, 18:26
par Elie
Je me permet de remettre un peu le sujet d'actualité ...

Comment remplacer que les mots contenant un espace avant et un espaces apres ...

Que si je recherche "Linux" il ne me change pas "linuxiens"...

Merci, Elie

Posté : 10 juin 2006, 18:53
par ouckileou
En modifiant le modèle à rechercher, soit cette partie :
"!linux!i"

Posté : 11 juin 2006, 09:06
par Ripat
Et en utilisant l'assertion \b qui est faite pour ça. Elle marquera la séparation de mot. Cette assertion a égalemement une caractéristique particulière, c'est qu'elle ne consomme pas de caractères. Le mieux est de la voir à l'oeuvre dans un exemple

Posté : 12 juin 2006, 12:35
par Elie
Je relance encore une fois le sujet parce que ca m'interesse :)

Voici le code actuel :
$fichier = preg_replace("#\b".$_POST['mot_recherche']."s?\b#i",stripslashes($_POST['remplace_par']),$fichier);
Cela trouve le mot 'non sensitivement', au pluriel ou non, et contenant des espaces avant et apres pour bien l'isoler.

Je voulais en plus savoir comment ne selectionner les mots contenu entre les crochets > et < pour eviter de modifier des mots contenu dans les balises HTML.

Le mot ne doit pas etre collé au balise >< mais contenu entre les deux pour etre sur que ce n'est ni de la source HTML, ni du PHP :)

Pareil que pour \b, juste un exemple me suffirait pour mon apprentissage.

Merci, Elie

Posté : 12 juin 2006, 15:20
par Ripat
Le problème de remplacement dans ou hors balises n'est pas évident. J'ai proposé sur ce forum une solution qui marche dans la plupart des cas. Mais, comme souvent dans les regex, il y a des exceptions où cette solution ne marchera pas.

Voir ici:
http://www.phpfrance.com/forums/viewtopic.php?t=199