[php - regex] Remplacer tous les & saufs certains.

Remplacer tous les & saufs certains. [php - regex] - PHP - Programmation

Marsh Posté le 06-12-2003 à 00:34:05    

VOilà, je veux remplacer tous les & par des & sauf les & suivis de chiffres et de ; . Ex &1256;.
 
Je sais comment nier une classe [^0-9] mais ça ne m'avance pas.
J'ai pensé à remplacer d'office tous les "&" en et "&" et par après remplacer les "&[0-9]?;" par la même chose avec un simple &.
 
N'y a-t-il pas plus efficace.

Reply

Marsh Posté le 06-12-2003 à 00:34:05   

Reply

Marsh Posté le 06-12-2003 à 10:04:55    

T'as essayé htmlentities() ?


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 06-12-2003 à 13:22:15    

Oui, en fait certains navigateurs me renvoient le signe euro de manière correcte en &xxxx; j'ai oublié le numméro :). Et htmlentities remplace tous les & par et &. Ce que je veux faire c'est un remplacement sélectif qui ne remplace pas les & suivis de quelques chiffres et de ;.

Reply

Marsh Posté le 06-12-2003 à 13:25:14    

est-ce que les chiffres suivant le & sont toujours 4 ?

Reply

Marsh Posté le 06-12-2003 à 13:30:19    

oui, on peut le voir comme ça :)
En fait c'est pas le cas mais si tu as une slouce avec 4, je prends ;)


Message édité par belgique le 06-12-2003 à 13:30:59
Reply

Marsh Posté le 06-12-2003 à 13:41:40    

En fait ce qu'il faut absolument pour le faire avec une expression régulière c'est le format exact que peut avoir ta chaîne
 
Par 'exact' j'entends toutes les formes pour lesquelles tu veut faire une correspondance

Reply

Marsh Posté le 06-12-2003 à 13:42:57    

Ca c'est pas un problème. Ma question est de dire par exemple: tu me remplace tous les & sauf ceux suivis de 4 chiffres :/

Reply

Marsh Posté le 06-12-2003 à 13:43:44    

Voilà ce que je voulais :)

Reply

Marsh Posté le 06-12-2003 à 13:52:11    

Code :
  1. $str = preg_replace('/&(?![#0-9a-z]+;)/i', '&', $str);


 
ça devrait le faire avec ça.


Message édité par bobe le 06-12-2003 à 13:52:59
Reply

Marsh Posté le 06-12-2003 à 13:54:34    

Saleté, mon livre qui parle des regexp est un peu court :/ . Merci, je vais chercher de comprendre la doc qui explique le ?!, je suppose que c'est pour nier ce qu'il y a entre ()

Reply

Marsh Posté le 06-12-2003 à 13:54:34   

Reply

Marsh Posté le 06-12-2003 à 13:59:15    

c?est une assertion positive. Littéralement, mon regexp signifie:
 
remplace toutes les éperluettes qui ne sont pas suivies de lettres, chiffres ou du dièze (caractères qui composent les entités définies dans le (x)html, les entités numériques ou héxadécimales) puis d?un point virgule.
 
il y en a quatre:
 
assertion positive: pattern(?=sub-pattern) - doit être suivi de
assertion négative: pattern(?!sub-pattern) - ne doit pas être suivi de
assertion arrière positive: (?<=sub-pattern)pattern - doit être précédé de
assertion arrière négative: (?<!sub-pattern)pattern - ne doit pas être précédé de
 
Voilou :)

Reply

Marsh Posté le 06-12-2003 à 14:04:18    

Un grand merci, c'est exactement ce que je cherchais :)

Reply

Marsh Posté le 06-12-2003 à 14:05:32    

(Désolé, je suis un peu perfectionniste)  
C?est plus stricte comme ça:
 

Code :
  1. $str = preg_replace('/&(?!(#[0-9]{2,5}|#x[0-9a-f]{2,5}|[a-z]+);)/i', '&amp;', $str);


 
Par contre, je suis pas sur pour le minimum et maximum de chiffres (et lettres) dans le cas d?une entité numérique (ou héxadécimale).


Message édité par bobe le 06-12-2003 à 14:08:01
Reply

Marsh Posté le 06-12-2003 à 14:16:21    

Voilà ce que j'ai fait :).


$from[]="'&(?!#[0-9]{1,4};)'i";
$to[]='&amp;\\1';


Je traiterai eventuellement le cas des &euro; mais je n'ai jamais vu de navigateurs envoyant celà :).
Je n'ai plus qu'à remplacer les caractères ? windows par une entité valide :).

Reply

Marsh Posté le 06-12-2003 à 14:25:34    

Oups, je n'avais pas vu que tu avais posté avant moi. :). Je pensais faire un truc comme tu l'as fait. Merci de me découper le travail de la sorte :).

Reply

Marsh Posté le 06-12-2003 à 14:28:02    

Maintenant que je regarde ton truc, je trouve que ça manque de parenthèses :p.
 
Voilà ma dernière version :


'&(?!(#[0-9]{1,4})|(#x[0-9a-f]{2,5})|([a-zA-Z])+;)'


 :).
Celà dit j'hésite à inclure les &euros et autres comme je l'ai fait.  


Message édité par belgique le 06-12-2003 à 14:32:58
Reply

Sujets relatifs:

Leave a Replay

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