アンカーせずにページ上のURLの正しい正規表現の書き方?
-
22-08-2019 - |
質問
私のようなすべてのURLのカットしたい(。ます。http:// ... の)をしてアンカーにそれらを交換<a></a>
しかし、私の要件:
以下のようなアンカーとページ定義(ドキュメントタイプ)を触れないでください。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
だから私は、URLのとちょうどプレーンテキストを見つける必要がある...
私は自分のページ内にレンダリング上書きしようとしていると私はBrowserAdapterを作っます:
<browser refID="default">
<controlAdapters>
<adapter controlType="System.Web.Mvc.ViewPage"
adapterType="Facad.Adapters.AnchorAdapter" />
</controlAdapters>
</browser>
それは次のようになります:
public class AnchorAdapter : PageAdapter
{
protected override void Render(HtmlTextWriter writer)
{
/* Get page output into string */
var sb = new StringBuilder();
TextWriter tw = new StringWriter(sb);
var htw = new HtmlTextWriter(tw);
// Render into my writer
base.Render(htw);
string page = sb.ToString();
//regular expression
Regex regx = new Regex("http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", RegexOptions.IgnoreCase);
//get the first match
Match match = regx.Match(page);
//loop through matches
while (match.Success)
{
//output the match info
System.Web.HttpContext.Current.Response.Write("<p>url match: " + match.Groups[0].Value+"</p>");
//get next match
match = match.NextMatch();
}
writer.Write(page);
}
}
解決
あなたはちょうどそれが引用符でだかどうかを確認するために先にビットを検索し、URLの後ろにする必要があり、それはそう誰かが平文として引用されたURLを貼り付けますですが、URLは常にタグや文書型で引用されています。だからあなたの正規表現になります:
(^|[^'"])(http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?)([^'"]+|$)
(^ | [^ ' "] +)、文字列の先頭または引用されていない文字を意味し、 ([^ ' "] | $)は、文字列の末尾か引用
を意味し、古い正規表現の周りの余分な括弧を使用すると、\ 2(グループ2)の代わりに、それがURLのエッジ
にマッチしている場合があります余分ながらくたを取得すると、実際のURLを取得することができますので、それはキャプチャグループの確保しますところで、あなたのURLの正規表現は、よりコンパクトで正確な形式がありますが、かなり悪い見えます。あなたは本当にすべてをエスケープする必要はありません。
所属していません StackOverflow