تعبير منتظم لاستبدال علامات الاقتباس في علامات HTML فقط

StackOverflow https://stackoverflow.com/questions/2447947

سؤال

لدي السلسلة التالية:

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

أريد استخدام تعبيرات منتظمة لإرجاع ما يلي:

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

لاحظ كيف أصبحت سمة المعرف في DIV الآن محاطا بالفاتونات؟

كيف يمكنني القيام بذلك مع تعبير منتظم؟

تعديل: أنا لا أبحث عن رصاصة سحرية للتعامل مع كل حالة حافة في كل موقف. يجب أن نكون جميعا متعبين باستخدام Regex لتحليل HTML ولكن في هذه الحالة بالذات وحاجتي الخاصة، فإن Regex هو الحل ... أحتاج فقط إلى القليل من المساعدة في الحصول على التعبير المناسب.

تحرير رقم 2: ساعدت جينز في إيجاد حل بالنسبة لي، لكن أي شخص يأتي بشكل عشوائي إلى هذه الصفحة يجب أن يفكر طويلا وشعبا جدا باستخدام هذا الحل. في حالتي تعمل لأنني واثق جدا من نوع السلاسل التي سأتعامل معها. أعرف الأخطار والمخاطر وتأكد من القيام بها. إذا لم تكن متأكدا مما إذا كنت تعرف ذلك، فربما يشير إلى أنك لا تعرف ولا ينبغي أن تستخدم هذه الطريقة. لقد تم تحذيرك.

هل كانت مفيدة؟

المحلول

يمكن القيام بذلك بالطريقة التالية: أعتقد أنك تريد استبدال كل مثيل ", هذا بين < و > مع '.

لذلك، أنت تبحث عن كل " في ملفك، انظر وراء <, ، وقبل >. وبعد يبدو Regex:

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

يمكنك استبدال الشخصيات التي تم العثور عليها حسب رغبتك، وربما باستخدام Regex.Replace.

ملاحظة: أثناء العثور على مجتمع Regex / HTML، تم استجواب أسئلة Regex / HTML هذه من الغضب كثيرا، في رأيي. بعد كل شيء، لا يسأل هذا السؤال هنا "ما يطابق Regex جميع أتش تي أم أل صالح، ولا يتطابق مع أي شيء آخر."

نصائح أخرى

يمكنك مطابقة:

(<div.*?id=)"(.*?)"(.*?>)

واستبدال هذا مع:

$1'$2'$3

أرى أنك تدرك مخاطر استخدام Regex للقيام بهذه الأنواع من بدائل. لقد أضفت الإجابة التالية لأولئك الذين يبحثون عن طريقة أكثر بكثير "مستقرة" إذا كنت ترغب في الحصول على حل سيستمر في العمل كمستندات الإدخال.

باستخدام حزمة أجيليتي HTML (صفحة المشروع, Nuget.)، هذا يفعل الخدعة:

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 */);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top