Expresión regular para reemplazar las comillas en etiquetas HTML solamente

asp.net c# html-agility-pack regex

Pregunta

Tengo la siguiente cadena:

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

Quiero usar expresiones regulares para devolver lo siguiente:

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

¿Observa cómo el atributo id en el div ahora está rodeado de apóstrofes?

¿Cómo puedo hacer esto con una expresión regular?

Edit: no estoy buscando una bala mágica para manejar cada caso de borde en cada situación. Todos deberíamos estar cansados ​​de usar regex para analizar HTML pero, en este caso particular y para mi necesidad particular, regex ES la solución ... Solo necesito un poco de ayuda para obtener la expresión correcta.

Edición n. ° 2: Jens ayudó a encontrar una solución para mí, pero cualquier persona que venga al azar a esta página debería pensar mucho en utilizar esta solución. En mi caso, funciona porque tengo mucha confianza en el tipo de cuerdas con las que voy a tratar. Conozco los peligros y los riesgos y me aseguro de hacerlo. Si no está seguro de saberlo, entonces probablemente indica que no sabe y no debe usar este método. Has sido advertido.

Respuesta aceptada

Esto se podría hacer de la siguiente manera: Creo que desea reemplazar cada instancia de " , es decir, entre < y a > con ' .

Por lo tanto, busque cada " en su archivo, mire hacia atrás para < , y adelante para a > . La expresión regular se ve así:

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

Puede reemplazar los caracteres encontrados a su gusto, tal vez utilizando Regex.Replace .

Nota: Si bien me pareció que la comunidad de desbordamiento de pila es más amigable y útil, estas preguntas de Regex / HTML son respondidas con demasiado enojo, en mi opinión. Después de todo, esta pregunta aquí no pregunta "qué expresión regular coincide con todos los HTML válidos, y no coincide con ninguna otra cosa".


Respuesta popular

Veo que está al tanto de los peligros de usar Regex para hacer este tipo de reemplazos. He agregado la siguiente respuesta para aquellos que buscan un método que sea mucho más 'estable' si desea tener una solución que siga funcionando a medida que cambien los documentos de entrada.

Usando el paquete de agilidad HTML ( página del proyecto , nuget ), esto hace el truco:

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 */);


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué