web-dev-qa-db-fra.com

Javascript regex négatif lookbehind ne fonctionne pas dans Firefox

J'ai besoin de modifier la regex javascript suivante parce que lookbehind négatif en elle lance une erreur dans firefox:

content = content.replace(/(?![^<]*>)(?:[\"])([^"]*?)(?<!=)(?:[\"])(?!>)/g, '„$1“');

Quelqu'un a-t-il une idée et peut-il m'aider?

Merci d'avance!

9
Cla

Les lookbehinds sont uniquement disponibles dans les navigateurs prenant en charge la norme ECMA2018, ce qui signifie que seules les dernières versions de Chrome peuvent les gérer.

Pour prendre en charge la majorité des navigateurs, convertissez votre modèle pour n'utiliser que des lookaheads.

Le (?<!=) le lookbehind négatif s'assure qu'il n'y a pas = immédiatement à gauche de l'emplacement actuel. [^"] est le atom qui correspond à ce caractère (notez que ? quantifier le rend facultatif, mais " c'est avant [^"] ne peut pas être = et il n'est pas nécessaire de restreindre cette position).

Donc, vous pouvez utiliser

content = content.replace(/(?![^<]>)"([^"=]?)"(?!>)/g, '„$1"');
                                      ^^^^^

Notez que (?:[\"]) est égal à ". [^"=]? correspond à 1 ou 0 occurrence d'un caractère autre que " et =.

Voir la démo regex .

14
Wiktor Stribiżew

L'équivalent exact de votre expression régulière (?![^<]*>)"([^"]*?)(?<!=)"(?!>)

sans l'affirmation de derrière est:

(?![^<]*>)"((?:[^"=]+|=(?!"))*)"(?!>)

Version lisible

 (?! [^<]* > )
 "
 (                             # (1 start)
      (?:
           [^"=]+ 
        |  
           = 
           (?! " )
      )*
 )                             # (1 end)
 "
 (?! > )

Notez que ce n'est pas comme votre réponse choisie, qui est pas un équivalent.

3
user557597

Les assertions de lookbehind font partie d'ES2018. Ils ne sont pas encore pris en charge par Firefox, c'est pourquoi vous obtenez une erreur.

Chrome les prend en charge depuis la version 62 , et vous pouvez les utiliser dans Node.js> = 6.4 avec le drapeau d'harmonie, ou dans> = 9 sans aucun drapeau.

Vous pouvez vérifier la proposition ici & support du navigateur ici

2
Marcos Casagrande