2012-03-05 2 views
1

J'ai une regex qui correspond aux URL et les convertit en liens HTML. Si l'URL est déjà partie d'un lien que je ne veux pas faire correspondre, par exemple:Regex match sinon après le mot

http://stackoverflow.com/questions/ask 

doit correspondre, mais:

<a href="http://stackoverflow.com/questions/ask">Stackoverflow</a> 

ne doit pas correspondre

Comment puis-je créer une regex pour le faire?

+0

Pouvez-vous s'il vous plaît poster quelques lignes de la chaîne d'entrée? Le deuxième cas ne doit pas correspondre car il fait partie d'une balise d'ancrage ou parce qu'il a déjà été apparié? –

+0

Décrivez ce qui doit correspondre. Pour travailler avec des expressions régulières, vous devez être aussi strict que possible. Ed: peut-être que^et $ feront le travail. –

+0

duplication possible de [Regex ignore URL déjà dans les balises HTML] (http://stackoverflow.com/questions/9567836/regex-ignore-url-already-in-html-tags) – stema

Répondre

2

Si votre URL correspondant à une expression régulière est $URL, vous pouvez utiliser le modèle suivant

(?<!href[\"'])$URL 

En PHP, vous écririez

preg_match("/(?<!href[\"'])$URL/", $text, $matches); 
1

Vous pouvez utiliser un lookbehind négatif pour affirmer que l'URL est pas précédé par href="

(?<!href=") 

(Votre modèle URL correspondant doit aller immédiatement après.)

0

Cette link fournit des informations. La solution acceptée est la suivante:

<a\s 
     (?:(?!href=|target=|>).)* 
     href="http:// 
     (?:(?!target=|>).)* 

En supprimant les références à "target" cela devrait fonctionner pour vous.

0

Essayez cette

/(?:(([^">']+|^)https?\:\/\/[^\s]+))/m