Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1318 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  preg_replace : problèmes d'expression régulière

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

preg_replace : problèmes d'expression régulière

n°1857049
claire_n
Posté le 03-03-2009 à 12:20:03  profilanswer
 

Bon je sais que ça n'est pas vraiment un problème PHP mais je ne savais pas ou mettre le message.
 
J'ai une liste de termes (immenses et dynamiques) que je dois entouré de balises.
Cependant, ces termes peuvent très similaires et je ne veux entourer que les chaines les plus longues (elles sont triés par longueur).
Par exemple : si j'ai "un ordinateur puissant" et "ordinateur", je ne veux mettre en gras que "un ordinateur puissant" dans mon texte et ne pas me retrouver avec

Code :
  1. <b>un <b>ordinateur</b> puissant</b>


 
 
Je souhaiterais utiliser preg_replace, qui me semble relativement efficace dans mon cas, et donc évidement les expressions régulières.
Mais la librairie qui gère les expressions n'accepte pas les expressions qui refuse des chaines qui n'ont pas de taille fixe comme celle ci :

Code :
  1. (?<![a-z0-9\s]*)


 
 
J'ai ca comme base :

Code :
  1. /(?<!b> )LE TERME(?!<\\/b> )/i


 
qui me permet d'éviter de recréer des balises si le terme trouvé est directement précédé ou suivi par la balise.
 
Mais j'aurais besoin de pouvoir définir que s'il y a cette balise, alors même s'il y a du texte ou des espaces entre, il ne faut pas remettre une balise.
J'avais fait quelques choses comme ca : mais comme la taille de la chaine n'est pas fixe cela me fait une erreur :

Code :
  1. (?<!b>[A-z0-9\s]*)LE TERME(?!<\\/b> )/i


 
 
J'essaie de trouver une autre manière de formuler ca en regexp, mais j'avoue que je bloque complètement...
Est ce que quelqu'un aurait une idée ?

mood
Publicité
Posté le 03-03-2009 à 12:20:03  profilanswer
 

n°1857074
fluminis
Posté le 03-03-2009 à 13:39:27  profilanswer
 

Waouh ca va etre super long si tu as beaucoup de termes à chercher,
car si je comprends bien ton algo, comme tu mets LE TERME dans l'expression régulière, tu fais autant de recherche d'expression régulière que tu as de termes a chercher.
 
est-ce que tu peux arriver a factoriser les choses comme ça :
/(un|des|les)?\s*ordinateur(s)?\s*(puissant(s)?)?/i
afin de n'avoir aucun terme en englobant un autre ?
 
(pas testé donc je garanti pas la regexp ;) )


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1857083
claire_n
Posté le 03-03-2009 à 13:54:42  profilanswer
 

Non pas possible, je n'ai absolument aucun contrôle sur les termes (ca peut donc être à peu près tout est n'importe quoi).
D'après ce que je sais, le preg_replace est relativement rapide, et ca ne posera pas de problème si ca prend 2-3 secondes, ou même 10 a la limite (mais si ca prend 2-3 minutes par contre...).
 
C'est pourquoi je voudrais bien pouvoir utiliser preg_replace uniquement et donc j'ai besoin d'une expression régulière qui me traite tout ce qu'il faut pour chaque terme (sinon je vais devoir faire un traitement en plus, et la ca alourdira d'autant...)
 
Le problème c'est que l'expression que j'ai pour le moment ne fonctionne pas dans preg_replace... sauf a avoir la version php 5.2 (d'après ce que j'ai lu ca a été corrigé)... mais vu que je suis en 5.1.6  :pfff:  
 

n°1857102
yellu
Posté le 03-03-2009 à 14:05:14  profilanswer
 

Je pense qu'il vaut mieux faire en deux étapes :
 
Mettre tes <b></b> sur tous les mots
Ensuite faire une moulinette de compression qui va retravailler la chaîne en fusionnant certains <b></b>
 
Mais ne pas le gérer directement dans le preg


Message édité par yellu le 03-03-2009 à 14:08:05
n°1857171
claire_n
Posté le 03-03-2009 à 15:53:44  profilanswer
 

merci Yellu, j'ai fonctionné comme tu me l'as conseillé, ca semble bien marché sans prendre excessivement plus de temps.
 
Ma formule ne peut pas marcher du tout en fait (ce que j'ai lu sur les versions n'étaient pas juste) il faut a priori vraiment que la chaîne qu'on ne veut pas soit de taille fixe (c'est bien dommage  :( ).
 
Merci !

n°1857187
claire_n
Posté le 03-03-2009 à 16:52:24  profilanswer
 

Bon j'ai déplacé mon problème à un autre endroit au final :(
 
Est-ce possible de nettoyer uniquement avec des expressions régulières ? ou le passage par un traitement php est inévitable ?
 
je me retrouve avec la problèmatique de ce genre de choses :

Code :
  1. <b> </b> <b> <b> </b> </b> <b> </b>


et je n'arrive pas a supprimer facilement les bonnes balises... il me prend régulièrement une des balises comme si c'était du texte entre (sachant que d'autres balises peuvent être utilisé tout comme un tas de caractères particuliers....)

n°1857205
fluminis
Posté le 03-03-2009 à 17:39:07  profilanswer
 

les expressions regulieres ne sont pas récurcives !
Dans le sens ou tu ne peux pas compter les balises ouvrantes / fermantes... donc ils est difficile de faire le nettoyage...


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1860850
grosbin
OR die;
Posté le 12-03-2009 à 17:53:20  profilanswer
 

hum ça ressemble au nettoyage d'un code tapé par une secrétaire sous fckeditor :)


---------------
Photos Panoramiques Montagnes Haute Savoie

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  preg_replace : problèmes d'expression régulière

 

Sujets relatifs
Warning: preg_match() [function.preg-match] j'ai besoin d'un aidéProblèmes en C et en GTK
problèmes avec order[Résolu] Expression régulière
[RESOLU] C# - Expression Régulière[PL/SQL] create or replace matable?
Problèmes avec la fonction mail (mails HTML) 
Plus de sujets relatifs à : preg_replace : problèmes d'expression régulière


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR