2011-02-08 3 views
1

J'ai trouvé une très belle URL regex matcher sur ce site: http://daringfireball.net/2010/07/improved_regex_for_matching_urls. Il indique qu'il est libre d'utiliser et qu'il est compatible avec plusieurs langues (y compris Javascript). Tout d'abord, je dois échapper à certains slash pour le compiler du tout. Quand je fais ça, ça marche bien sur Rubular.com (où je teste généralement les regex), avec l'effet secondaire étrange que chaque match a 5 champs: 1 est l'url, et les 4 supplémentaires sont vides. Quand je mets ceci dans JS, j'obtiens l'erreur "Groupe Invalide". J'utilise Node.js si cela fait une différence, mais j'aimerais pouvoir comprendre cette erreur. Je voudrais réduire les champs inutiles de correspondance vides, mais je ne sais même pas par où commencer à diagnostiquer cette bête. Voici ce que j'ai eu après m'être échappé:aider à faire une regex "universelle" Javascript compatible

(?xi)\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])) 

Répondre

3

En fait, vous n'avez pas non plus besoin du premier groupe de capture; c'est la même chose que le match entier dans ce cas, et qui peut toujours être consulté via $&. Vous pouvez modifier tous les groupes de capture à la non-capture en ajoutant ?: après l'ouverture parens:

/\b(?:(?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\((?:[^\s()<>]+|(\(?:[^\s()<>]+\)))*\))+(?:\((?:[^\s()<>]+|(?:\(?:[^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i 

Cette erreur « groupe non valide » est due aux modificateurs de ligne (c.-à-(?xi)) qui, comme @kirilloid observé, ne sont pas supportés en JavaScript. Jon Gruber (l'auteur de l'expression régulière) se trompait à ce sujet, car il parlait de JS supportant le mode d'espacement libre. Juste pour info, la raison pour laquelle vous avez dû échapper aux barres obliques est que vous utilisiez la notation regex-littérale, dont la forme la plus courante utilise la barre oblique comme délimiteur de regex. En d'autres termes, c'est la langue (Ruby ou JavaScript) qui vous oblige à échapper à ce caractère particulier, pas la regex. Certaines langues vous permettent de choisir différents délimiteurs de regex, tandis que d'autres ne prennent pas en charge les littéraux regex.

Mais ce sont tous des problèmes de langue, pas de problèmes d'expressions régulières; la regex elle-même semble fonctionner comme annoncé.

2

Seemes, que vous avez mal copié.

http://www.regular-expressions.info/javascript.html

  • Aucun modificateur de mode pour définir les options correspondant dans l'expression régulière.
  • Pas de commentaires expression régulière

à savoir (? xi) au début est inutile.
x est inutile du tout pour RegExp compactée
i peut être remplacé par le drapeau
Tous ces résultats dans:

/\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i 

Testé et travailler dans Google Chrome => devrait travailler dans Node.js