Question

C# :Qu'est-ce qu'une bonne Regex pour analyser les hyperliens et leur description ?

Veuillez tenir compte de l'insensibilité à la casse, des espaces et de l'utilisation de guillemets simples (au lieu de guillemets doubles) autour de la balise HREF.

Veuillez également envisager d'obtenir des hyperliens contenant d'autres balises dans le <a> des balises telles que <b> et <i>. ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

Était-ce utile?

La solution

Tant qu'il n'y a pas de balises imbriquées (ni de sauts de ligne), la variante suivante fonctionne bien :

<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a>

Dès que les balises imbriquées entrent en jeu, les expressions régulières ne sont plus adaptées à l'analyse.Cependant, vous pouvez toujours les utiliser en appliquant des fonctionnalités plus avancées des interprètes modernes (en fonction de votre machine d'expression régulière).Par exemple.Les expressions régulières .NET utilisent une pile ;J'ai trouvé ça:

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

Source: http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

Autres conseils

Voir cet exemple de Débordement de pile :Expression régulière pour analyser les liens d'une page Web ?

En utilisant Le Pack Agilité HTML vous pouvez analyser le HTML et extraire les détails en utilisant la sémantique du HTML, au lieu d'une expression régulière brisée.

j'ai trouvé ça Mais apparemment ces gars j'ai eu quelques problèmes avec ça.

Modifier: (Ça marche!)
J'ai maintenant fait mes propres tests et j'ai constaté que cela fonctionne, je ne connais pas C# donc je ne peux pas vous donner de réponse C# mais je connais PHP et voici le tableau de correspondances que j'ai récupéré en l'exécutant sur ceci :

<a href="pages/index.php" title="the title">Text</a>

array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 

je avoir une expression régulière qui gère la plupart des cas, même si je pense qu'il correspond au HTML dans un commentaire multiligne.

Il est écrit en utilisant la syntaxe .NET, mais devrait être facilement traduisible.

Je vais juste lancer cet extrait maintenant que je le fais fonctionner... c'est une version moins gourmande de celle suggérée plus tôt.L'original ne fonctionnerait pas si l'entrée contenait plusieurs hyperliens.Ce code ci-dessous vous permettra de parcourir tous les hyperliens :

static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
public void ParseHyperlinks(string html)
{
   MatchCollection mcHref = rHref.Matches(html);

   foreach (Match m in mcHref)
      AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value);
}

Voici une expression régulière qui correspondra aux balises équilibrées.

(?:""'[""'].*?>)(?(?>(?)|(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?: )

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