استبدل المحتوى في سلسلة استنادًا إلى regex.matches matchcollection

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

سؤال

لقد كنت أعمل على هذا Regex في اليوم الماضي أو نحو ذلك وأعتقد أنني قد عملت عليه حتى يعيد البيانات التي أريدها. أول خلفية صغيرة.

لدي محرر محتوى يتمكن المستخدمون من تحرير صفحات الويب. يمكنهم تنسيق النص وإضافة روابط وما إلى ذلك .. أشياء محرر المحتوى القياسية. عند النقر فوق "حفظ" ، يوفر المحرر القدرة على الحصول على المحتوى (محرر .-Content) ووضعه في سلسلة. ما أريد القيام به هو الحصول على أي روابط (<a> العلامات) ومعرفة ما إذا كانت روابط داخلية أو خارجية وما إذا كانت ملفات PDF.

هذا هو التعبير الذي توصلت إليه:

<a\b[^<>]*href\s*=\s*[\""\'](?<domain>https?:\/\/[^\/\s\'\""]*)*\/?(?<path>\/?[^\s\""]+?)?[[>\""\']

مع هذا ، أنا قادر على فصل المجال (إذا كان لديه واحد) والمسار خارج. ثم ، أحلق في المباريات ...

dim matchColl as MatchCollection = Regex.Matches(editorContent, regExString)
For Each m as Match in matchColl
   If m.Groups("domain").value <> myInternalDomain and m.Groups("domain").value <> "" then
       'this is an external domain... do some stuff
   End If
   If m.Groups("path").value.EndsWith(".pdf") then
         'it is a pdf, do some other stuff...
   End if
Next

سؤالي هو هذا ... الأجزاء التي "أقوم بها بعض الأشياء" للقيم ، ما هي أفضل طريقة للعودة إلى سلسلة "EditorContent" الخاصة بي؟ ربما كان بإمكاني وضع المحرر في stringbuilder وأن أقوم بمجموعة كاملة من الاستبدال ، ولكن هل هذا فعال للغاية؟

لذلك ، على سبيل المثال ، مع PDF ، أريد تحديد أنه مفتوح في نافذة جديدة (Target = "_ blank") ولعبور URL الخارجي ، أضف بعض كود JavaScript إلى سمة OnClick.

اي فكرة يمكن ان تكون رائعة!

شكرًا!

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

المحلول

أعتقد أنك تريد أن تفعل Regex.Replace ويمر في أ MatchEvaluator. أساسا MatchEvaluator هو مندوب إلى وظيفة تُرجع سلسلة بديلة.

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