/ / Espressione regolare per trovare una corrispondenza con un modello nel codice HTML - c #, regex

Espressione regolare per abbinare un modello nel codice HTML - c #, regex

Ottengo il codice seguente da un browser web.

Il mio codice sorgente: (Html)

<dl class="field-dl output-field-dl" >
<dt class="field-dt output-field-dt">
<label><span>Product Code:</span></label>
</dt>
<dd class="field-dd output-field-dd ">
0234567
</dd>
</dl>

<dl class="field-dl output-field-dl" >
<dt class="field-dt output-field-dt">
<label><span>Per no:</span></label>
</dt>
<dd class="field-dd output-field-dd ">
123456
</dd>
</dl>

Come estraggo il codice del mio prodotto?

Il mio codice attuale è qui:

var rx = new Regex("<span>Product Code:</span></label></dt><dd class="field-dd output-field-dd ">(.*?)</dd>\s");
var m = rx.Matches(kaynak);
foreach (Match match in m)
{
string key = match.Groups[1].Value;
}

Grazie!

risposte:

0 per risposta № 1

Il codice di esempio ha molto più spazio bianco rispetto agli handle di regex. Potresti aggiungere s* prima di ogni < e dopo ogni >, ma solo uno tra di loro. Qualcosa di simile a:

new Regex("<span>\s*Product Code:\s*</span>\s*</label>\s*</dt>\s*<dd class="field-dd output-field-dd ">(.*?)</dd>\s");

Il gruppo di cattura (.*?) potrebbe essere troppo generoso. suggerirei ([^<>]). Se preferisci il file . quindi impostare la regex per accettare le nuove righe all'interno . potrebbe essere necessario. Quindi considera l'utilizzo di:

new Regex(... , RegexOptions.Singleline);

Tuttavia, come dicono altri, è probabilmente meglio utilizzare routine di analisi HTML o XML. Questa risposta ha lo scopo di riferirsi solo alla parte regex della tua domanda.


0 per risposta № 2

Puoi usare LINQ to XML:

XElement doc = XElement.Parse(html);
var query = doc.Descendants("dd").Select(elem => elem.Value).ToList();

foreach (var v in query)
Console.WriteLine(v);