2009-05-09 7 views
1

Comment puis-je écrire une expression régulière pour remplacer des liens avec aucun texte de lien comme ceci:Comment puis-je écrire une expression régulière pour capturer des liens sans texte de lien?

<a href="http://www.somesite.com"></a> 

avec

<a href="http://www.somesite.com">http://www.somesite.com</a> 

?

C'est ce que j'essayais de faire pour capturer les correspondances, et il n'en attrape aucune. Qu'est-ce que je fais mal?

string pattern = "<a\\s+href\\s*=\\s*\"(?<href>.*)\">\\s*</a>"; 

Répondre

2

Je peux me tromper, mais je pense que vous avez simplement besoin de changer le quantificateur au sein du groupe href d'être paresseux plutôt que gourmand.

string pattern = @"<a\s+href\s*=\s*""(?<href>.*?)"">\s*</a>"; 

(j'ai aussi changé le type de chaîne de caractères à utiliser @, pour une meilleure lisibilité.)

Le reste du regex semble bien pour moi. Le fait que vous ne capturiez aucun résultat me fait penser autrement, mais il pourrait y avoir un problème dans le reste du code (ou même les données d'entrée - avez-vous vérifié cela?).

1

Je suggère

string pattern = "(<a\\b[^>]*href=\"([^\"]+)\"[^>]*>)[\\s\\r\\n]*(</a>)"; 

De cette façon aussi des liens avec leur attribut href quelque part serait capturé d'autre.

Remplacer par

"$1$2$3" 

Le mot habituel d'avertissement: HTML et regex sont essentiellement incompatibles. Utilisez avec prudence, cela pourrait exploser.

8

Je ne voudrais pas utiliser une expression régulière - j'utiliser la Html Agility Pack, et une requête comme:

foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[.='']")) { 
    link.InnerText = link.GetAttribute("href"); 
} 
+0

+1 pour ma dose quotidienne d'apprendre quelque chose de nouveau. – womp

+1

+1 pour éviter les bas-fonds regex. – Tomalak

Questions connexes