سؤال

أنا أعمل على متجرد HTML متخصص. متجرد الحالي يستبدلu003Ctd> العلامات مع علامات التبويب ثمu003Cp style=";text-align:right;direction:rtl"> وu003Cdiv style=";text-align:right;direction:rtl"> العلامات مع عوائد نقل مزدوجة. ومع ذلك، عند تجريد رمز مثل هذا:

<td>First Text</td><td style="background:#330000"><p style="color:#660000;text-align:center">Some Text</p></td>

ينتج عنه (من الواضح)

First Text

Some Text

نود أن يكون لديكu003Cp style=";text-align:right;direction:rtl"> تم استبدال أي شيء في هذه الحالة، لذلك ينتج:

First Text (tab) Some Text

ومع ذلك، نود الاحتفاظ بديل عودة النقل المزدوج لرمز آخر حيثu003Cp style=";text-align:right;direction:rtl"> العلامة لا تحيط بهاu003Ctd> العلامات.

أساسا، نحن نحاول استبدالu003Ctd> العلامات مع t دائما وu003Cp style=";text-align:right;direction:rtl"> وu003Cdiv style=";text-align:right;direction:rtl"> العلامات مع r r فقط عندما لا تحيط بهمu003Ctd> العلامات.

الرمز الحالي: (C #)

  // insert tabs in places of <TD> tags
  result = System.Text.RegularExpressions.Regex.Replace(result,
           @"<td\b(?:[^>""']|""[^""]*""|'[^']*')*>", "\t",
           System.Text.RegularExpressions.RegexOptions.IgnoreCase);  

  // insert line paragraphs (double line breaks) in place
  // of <P>, <DIV> and <TR> tags
  result = System.Text.RegularExpressions.Regex.Replace(result,
           @"<(div|tr|p)\b(?:[^>""']|""[^""]*""|'[^']*')*>", "\r\r",
           System.Text.RegularExpressions.RegexOptions.IgnoreCase);

(هناك المزيد من الكود إلى متجرد؛ هذا هو الجزء ذي الصلة)

أي أفكار حول كيفية القيام بذلك دون إعادة كتابة متجرد كامل؟

عدل إذا لم يكن هناك حل آخر، فربما، فربما ربما استخدم حزمة أوتال أزياء HTML.

في الغالب، يترجم Stripper فقط على أي شيء يجده يبدو وكأنه علامة (تتم مع Regex كبيرة بناء على Regex في كتاب طبخ التعبيرات العادية. رمز تجريد مخصص.

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

المحلول 2

وجدت الجواب:

  // remove p/div/tr inside of td's
  result = System.Text.RegularExpressions.Regex.Replace(result, @"<td\b(?:[^>""']|""[^""]*""|'[^']*')*>.*?</td\b(?:[^>""']|""[^""]*""|'[^']*')*>", new MatchEvaluator(RemoveTagsWithinTD));

يدعو هذا الرمز هذه الطريقة المنفصلة لكل مباراة:

  //a separate method
  private static string RemoveTagsWithinTD(Match matchResult) {
      return Regex.Replace(matchResult.Value, @"<(div|tr|p)\b(?:[^>""']|""[^""]*""|'[^']*')*>", "");
    }

كان هذا الرمز (مرة أخرى) بناء على وصفة أخرى من التعبيرات العادية كوكبوك (الذي كان يجلس أمامي طوال الوقت، D'Oh!). إنه حقا كتاب رائع.

نصائح أخرى

هل فكرت في النظر إلى حزمة أجريتي HTML, ، والتي سيكون لديها الكثير من خيارات التحليل المدمجة في التي تلاعب العلامات؟

ليس لدي إجابة بقدر ما يكتبها مع تعبيرات منتظمة، لكنني أوصي بشدة حزمة أجريتي HTML لشيء مثل هذا. يجب أن تكون قادرا على العثور على العقد بسهولة مع محدد بسيط واستبدالها بكل ما تريد.

لذلك إذا لم تتمكن من استخدام حزمة أجيليتي. ماذا لو أنشأت تطابق بسيط تم التحقق من وجود الكتلة. إذا كان موجودا، فيمكنك القيام بكل البدلات المناسبة للعلامات داخل الكتلة، وإلا تتمتع بمجموعة ثانية من البديلات التي تعمل من أجل العلامات وليس داخل الكتلة.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top