Espressione regolare per sostituire solo le virgolette nei tag HTML

asp.net c# html-agility-pack regex

Domanda

Ho la seguente stringa:

<div id="mydiv">This is a "div" with quotation marks</div>

Voglio usare le espressioni regolari per restituire quanto segue:

<div id="mydiv">This is a "div" with quotation marks</div>

Si noti come l'attributo id nel div sia ora circondato da apostrofi?

Come posso farlo con un'espressione regolare?

Modifica: Non sto cercando una bacchetta magica per gestire ogni caso limite in ogni situazione. Dovremmo essere tutti stanchi di usare regex per analizzare HTML ma, in questo caso particolare e per la mia particolare esigenza, regex è la soluzione ... Ho solo bisogno di un po 'di aiuto per ottenere la giusta espressione.

Modifica n. 2: Jens mi ha aiutato a trovare una soluzione per me, ma chiunque venga in modo casuale a questa pagina dovrebbe pensare a lungo e molto duramente per usare questa soluzione. Nel mio caso funziona perché sono molto fiducioso del tipo di stringhe con cui mi occuperò. Conosco i pericoli e i rischi e mi assicuro che lo facciate. Se non sei sicuro se lo sai, probabilmente indica che non sai e non dovresti usare questo metodo. Sei stato avvertito.

Risposta accettata

Questo potrebbe essere fatto nel modo seguente: Penso che tu voglia sostituire ogni istanza di " , che è tra un < e un > con ' .

Quindi, cerca ogni " nel tuo file, guarda indietro per un < , e avanti per un > . L'espressione regolare è simile a:

(?<=\<[^<>]*)"(?=[^><]*\>)

Puoi sostituire i personaggi trovati a tuo piacimento, magari usando Regex.Replace .

Nota: sebbene abbia trovato la comunità di Overflow dello stack più amichevole e utile, queste domande su Regex / HTML hanno risposto con un po 'di rabbia, secondo me. Dopotutto, questa domanda qui non chiede "Quale regex corrisponde a tutto l'HTML valido e non corrisponde ad altro".


Risposta popolare

Vedo che sei consapevole dei pericoli dell'uso di Regex per fare questo tipo di sostituzioni. Ho aggiunto la seguente risposta a coloro che sono alla ricerca di un metodo che è molto più "stabile" se si desidera avere una soluzione che continuerà a funzionare mentre i documenti di input cambiano.

Utilizzando l'HTML Agility Pack ( pagina del progetto , nuget ), questo è il trucco:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("your html here"); 
// or doc.Load(stream);

var nodes = doc.DocumentNode.DescendantNodes();

foreach (var node in nodes)
{
    foreach (var att in node.Attributes)
    {
         att.QuoteType = AttributeValueQuote.SingleQuote;
    }
}

var fixedText = doc.DocumentNode.OuterHtml;
//doc.Save(/* stream */);



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché