Question

J'ai pris la libéral URL Daring Fireball Regex de , il a fusionné avec certaines des améliorations Alan tempête et piraté mon chemin dans la fixation de quelques bugs comme le support des caractères entre parenthèses IDN à l'intérieur. Voilà ce que j'ai:

/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/

Cependant, j'ai rencontré un bug que je ne suis pas en mesure de résoudre:

'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'

L'URL ci-dessus est reconnu comme www.dsd(sd)sdsd.com' (ou www.dsd.com/whatever(whatever)') au lieu de www.dsd(sd)sdsd.com (ou www.dsd.com/whatever(whatever)). Cela ne semble se produire lorsque l'URL est entre parenthèses, depuis l'adresse suivante:

'www.sampleurl.com'

est-il correctement être reconnu comme www.sampleurl.com.

Je pense que la partie [^[:punct:]\s]|\/ du regex n'est pas en cours d'exécution lorsque l'URL est entre parenthèses , j'ai essayé pendant un certain temps, mais je ne peux pas sembler trouver une solution. Quelqu'un peut-il me aider?

Pour marchandise, je l'ai mis en place un Rubular permalien avec le regex et certaines données de test (la dernière URL échoue).


Je pense que le regex de Gruber était un peu bousculé, par exemple, il ne correspond pas à l'URL comme ceux:

http://en.wikipedia.org/wiki/Something_(Special)_For_You

Je suis encore plus impressionné en voyant que les deux Gruber et Alan a manqué cette faute de frappe très simple:

\([\w\d]+\)

Ne serait pas \(\w+\) suffisant? : S

Était-ce utile?

La solution

On dirait que Gruber a révisé son expression régulière :

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

fonctionne très bien maintenant .

Autres conseils

www.dsd (sd) sdsd.com est pas un nom de domaine valide.

Si vous aviez 'www.dsd.com/whatever(whatever)', il serait reconnu correctement. (Ou au moins est dans mes tests)

 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

Voilà comment je pense que cela tombe en panne ... le bit de regex ci-dessus (sd) commence par une échappées paren ouvert, puis un sd correspondant de classe char regardé fixement, puis un paren de clôture évadés, et la prochaine chose est [^\s()<>]* qui correspond sdsd.com' .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top