私はこの RegEx に過去 1 日ほど取り組んできましたが、必要なデータが返されるようにうまくいったと思います。最初に少し背景を。
ユーザーが Web ページを編集できるコンテンツ エディターがあります。テキストの書式設定、リンクの追加などを行うことができます。標準的なコンテンツ エディターの機能です。保存をクリックすると、エディターはコンテンツ (editor.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」文字列に戻す最良の方法は何ですか? おそらく、editorContent を StringBuilder に入れ、その上で大量の置換を行うことができますが、それは非常に効率的ですか?
たとえば、PDF の場合、新しいウィンドウ (target="_blank") で開くように指定し、外部 URL については、onclick 属性に JavaScript コードを追加します。
どんなアイデアも素晴らしいでしょう!
ありがとう!