استبدل المحتوى في سلسلة استنادًا إلى regex.matches matchcollection
سؤال
لقد كنت أعمل على هذا 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
هو مندوب إلى وظيفة تُرجع سلسلة بديلة.