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

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

Marsh Posté le 03-03-2009 à 12:20:03    

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 ?

Reply

Marsh Posté le 03-03-2009 à 12:20:03   

Reply

Marsh Posté le 03-03-2009 à 13:39:27    

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
Reply

Marsh Posté le 03-03-2009 à 13:54:42    

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:  
 

Reply

Marsh Posté le 03-03-2009 à 14:05:14    

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
Reply

Marsh Posté le 03-03-2009 à 15:53:44    

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 !

Reply

Marsh Posté le 03-03-2009 à 16:52:24    

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....)

Reply

Marsh Posté le 03-03-2009 à 17:39:07    

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
Reply

Marsh Posté le 12-03-2009 à 17:53:20    

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


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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed