1

すべての URL のようなもの ( http://... .) を切り取り、それらをアンカーで置き換えたいの<a></a>ですが、私の要件: アンカーとページ定義 (Doc タイプ) に触れないでください:

<!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\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", 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);
    }
}
4

1 に答える 1

1

URLの前後を少し検索して、引用符で囲まれているかどうかを確認する必要があります。引用符で囲まれたURLをプレーンテキストとして貼り付ける可能性はほとんどありませんが、URLは常にタグとDoctypeで引用符で囲まれています。したがって、正規表現は次のようになります。

(^|[^'"])(http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&amp;\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?)([^'"]+|$)

(^ | [^'"] +)は文字列の始まり、または引用符ではない文字を意味します([^'"] | $)は文字列の終わりまたは引用符ではないことを意味します

古い正規表現を囲む余分な角かっこは、それがキャプチャグループであることを保証するため、URLの端で一致した可能性のある余分ながらくたを取得する代わりに、\ 2(グループ2)で実際のURLを取得できます。

ところで、あなたのURL正規表現はかなり悪く見えます、よりコンパクトで正確なフォームがあります。あなたは本当にすべてを逃れる必要はありません。

于 2009-05-18T18:18:08.440 に答える