Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/02/2006, 22h38   #1
Invité de passage
 
Inscription : décembre 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 24
Points : 3
Points : 3
Par défaut preg_replace et interdir une chaine

Bonsoir à tous,

Je suis en train de mettre en place un forum de discussion avec un WYSIWYG.
Voici mon probleme, je viens de trouver le bout de code ci dessous qui me va très bien pour couper les mots trop long.
Code :
1
2
3
4
5
 
function cutLongWords($string,$length='20',$separation=' ')
{
  return preg_replace('/([^ ]{'.$length.'})/si','\\1'.$separation,$string);
}
MAIS, cette fonction me découpe aussi mes mes images, car elles le chemin des images fait plus de 20 caractéres :
exple :
Code :
<img src="http://localhost/monsite/images/smileys/MonOeil.png">
et donc la fonction va me mettre un espace vers
ima ges/smileys/
donc l'image ne sera plus afficher.

Je voulais donc savoir si dans le motif de recherche à l'exemple de [^ ] qui interdit l'espace, on pouvait éviter de chercher une chaine du style (<img src) et (images/smileys)

Merci pour vos réponses
jojo22222 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 01h42   #2
Invité de passage
 
Inscription : décembre 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 24
Points : 3
Points : 3
Par défaut piste

Salut, je sens que je suis pas loin :
expression conditionnel, mais c'est pas encore ca
Code :
preg_replace('/([^ ]{'.$length.'})(?<!img src)/mi','\\1'.$separation,$string);
Des idées?
jojo22222 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 03h48   #3
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Pourquoi ne pas le faire en deux temps :
  1. mettre des espaces avec wordwrap()
  2. reconstruire les balises <img> sectionnées, à l'aide d'une regexp
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 09h49   #4
Invité de passage
 
Inscription : décembre 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 24
Points : 3
Points : 3
salut Kirkis,
En effet, ce sera la solution que j'adopterai lorsque je serai sur que mon essai en une seule passe n'est pas possible.
Code :
1
2
 
preg_replace('/([^ ]{'.$length.'})(?<!src=)img/mi','\\1'.$separation,$string);
jojo22222 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 14h44   #5
Membre émérite
 
Inscription : mai 2004
Messages : 708
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 708
Points : 853
Points : 853
En matière d'expressions régulières, la politique "d'une seule passe" est souvent dévastatrice car elle débouche sur des motifs kilométriques.

Mieux vaut décomposer. Une solution possible:

Code :
1
2
3
4
5
6
7
8
9
10
function mon_rplc_callback($capture){
  global $arg;
  return  preg_replace('/([^ ]{'.$arg['length'].'})/si', '\\1'.$arg['separation'] , $capture[1]).$capture[2];
}
 
function cutLongWords($string, $length='10', $separation=' '){
  global $arg;
  $arg = compact('length', 'separation'); 
  return preg_replace_callback('#((?:(?!<[/a-z]).)*)([^>]*>|$)#si', "mon_rplc_callback", $string);
}
Cette solution laissera intact le contenu des balises html.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 15h17   #6
Invité de passage
 
Inscription : décembre 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 24
Points : 3
Points : 3
Par défaut merci ripat

Je te remercie,
La solution que tu m'as donnée me va tout a fait, c'est elle dont j'avais besoin.
Si j'ai bien compris, tu cherches d'abords tous les motifs qui ne sont pas des balises html <> et ensuite tu testes s'ils sont plus longs que que lenght et si oui on découpe.

Pourrais tu me commenter le code des motifs qu'il y'a dans preg_replace_callback où m'indiquer (et ce serait mieux un site) où je pourrais me documenter et apprendre, parce que c'est tout neuf pour moi.

En tout cas merci
jojo22222 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 15h49   #7
Membre émérite
 
Inscription : mai 2004
Messages : 708
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 708
Points : 853
Points : 853
Le motif du preg_replace_callback est une version évoluée du simple:
  • ([^<]*) qui capture en 1 tout ce qui est hors balise
  • (<[^>]+>) capture ce qui se trouve entre < et >

Ce motif posait problème pour un texte comme:

Citation:
Le nombre <b>2</b> est plus petit que <b>4</b> soit 2<4
Dans 2 <4 le <4 était interprété comme une ouverture de balise html.

Il a fallu donc recourir aux assertions arrières négatives (negative lookbehind)
  • ((?:(?!<[/a-z]).)*) capture tout caractère non directement suivit par un <[a-z]
  • ([^>]*>) le même que celui du motif simplifié.

Pour un tuto, il y en a sur ce forum.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 16h29   #8
Invité de passage
 
Inscription : décembre 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 24
Points : 3
Points : 3
Par défaut Encore une fois merci

Il semblerait que tu sois un pro des expressions reguières
Je récapépète, en fait ce qui me semblait obsure c'est donc dans le premier motif :

le ?: qui signifie en fait qu'on pas besoin de capturer le motif si on le trouve,
par contre, [/a-z] qu'est ce que ca veut dire ?

Merci d'avance
jojo22222 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 19h54   #9
Membre émérite
 
Inscription : mai 2004
Messages : 708
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 708
Points : 853
Points : 853
Par défaut Re: Encore une fois merci

Citation:
Envoyé par jojo22222
[/a-z] qu'est ce que ca veut dire ?
Tout caractère de a à z ou le caractère /
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2006, 21h46   #10
Invité de passage
 
Inscription : décembre 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 24
Points : 3
Points : 3
C'est super sympa d'avoir répondu à mes questions.
Merci
Je clos le sujet
jojo22222 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web