Domanda

C#:Qual è un buon Regex per analizzare i collegamenti ipertestuali e la loro descrizione?

Si prega di considerare la distinzione tra maiuscole e minuscole, gli spazi bianchi e l'uso di virgolette singole (invece di virgolette doppie) attorno al tag HREF.

Ti consigliamo inoltre di ottenere collegamenti ipertestuali che abbiano altri tag all'interno del file <a> tag come <b> E <i>. ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

È stato utile?

Soluzione

Finché non ci sono tag nidificati (e interruzioni di riga), la seguente variante funziona bene:

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

Non appena entrano in gioco i tag nidificati, le espressioni regolari non sono più adatte all'analisi.Tuttavia, puoi comunque utilizzarli applicando funzionalità più avanzate degli interpreti moderni (a seconda della tua macchina regex).Per esempio.Le espressioni regolari .NET utilizzano uno stack;Ho trovato questo:

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

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

Altri suggerimenti

Vedi questo esempio da StackOverflow:Espressione regolare per l'analisi dei collegamenti da una pagina Web?

Utilizzando Il pacchetto di agilità HTML puoi analizzare l'HTML ed estrarre i dettagli utilizzando la semantica dell'HTML, invece di una regex interrotta.

ho trovato questo ma a quanto pare questi ragazzi ha avuto alcuni problemi con esso.

Modificare: (Funziona!)
Ora ho eseguito i miei test e ho scoperto che funziona, non conosco C# quindi non posso darti una risposta in C# ma conosco PHP ed ecco l'array di corrispondenze che ho ottenuto eseguendolo su questo:

<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" } 

IO avere un'espressione regolare che gestisce la maggior parte dei casi, anche se credo che corrisponda all'HTML all'interno di un commento su più righe.

È scritto utilizzando la sintassi .NET, ma dovrebbe essere facilmente traducibile.

Lancio questo frammento ora che funziona... questa è una versione meno avida di quella suggerita in precedenza.L'originale non funzionerebbe se l'input avesse più collegamenti ipertestuali.Il codice riportato di seguito ti consentirà di scorrere tutti i collegamenti ipertestuali:

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);
}

Ecco un'espressione regolare che corrisponderà ai tag bilanciati.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top