La plus belle façon de le faire est d'utiliser un lookbehind négatif (dans les langues qui les soutiennent):
/(?>http:\/\/[^\s]*)(?<!\.dtd)/g
Le ?>
dans la première tranche en fait un groupement atomique qui arrête le moteur regex retours en arrière - si il va correspondre à l'URL complète comme il le fait maintenant, et si/quand la prochaine partie échoue, il n'essaiera pas de revenir en arrière et de faire moins de correspondance.
Le (<!\.dtd)
est un test arrière négatif, ce qui correspond seulement si \.dtd
ne fait pas partie se terminant à cette position (à savoir, l'URL ne se termine pas dans .dtd
).
Pour les langues qui ne sont pas (comme JavaScript), vous pouvez faire une place négative préanalyse, ce qui est un peu plus laid et est généralement moins efficace:
/(http:\/\/(?![^\s]*\.dtd\b)[^\s]*)/g
correspondra à http://
, puis balayez l'avant pour vous assurer qu'il ne se termine pas en .dtd
, puis revenez en arrière et scannez à nouveau pour obtenir la correspondance réelle.
Comme toujours, http://www.regular-expressions.info/ est une bonne référence pour plus d'informations
obtenir erreur de syntaxe en raison de
dans (?Hmm. Il est possible que JavaScript ne supporte pas lookbehinds alors. Dans ce cas, je ne peux pas penser à une façon sympa de le faire avec une seule expression rationnelle - votre meilleur pari est simplement d'utiliser ce que vous avez maintenant, faites une boucle sur les résultats et supprimez manuellement toute fin dans ".dtd". – Chris
Je sais que JavaScript ne supporte pas regarder derrière. Cependant, il supporte l'anticipation positive et négative. –