Как правильно написать Regex для URL на странице без якорей? - PullRequest
1 голос
/ 18 мая 2009

Я хочу вырезать все 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\\~\\!\\@\\#\\$\\%\\^\\&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);
    }
}

1 Ответ

1 голос
/ 18 мая 2009

Вам просто нужно поискать немного впереди и позади URL-адреса, чтобы увидеть, находится ли он в кавычках, вряд ли кто-то вставит цитируемый URL в виде открытого текста, но URL всегда заключаются в теги и типы документов. Таким образом, ваше регулярное выражение становится:

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

(^ | [^ '"] +) означает начало строки или символа, который НЕ является кавычкой ([^ '"] | $) означает конец строки или не кавычка

Дополнительные квадратные скобки вокруг старого регулярного выражения гарантируют, что это группа захвата, поэтому вы можете получить фактический URL-адрес с помощью \ 2 (группа 2) вместо того, чтобы получить дополнительное дерьмо, которое могло бы соответствовать краям URL

Кстати, ваше URL-выражение выглядит довольно плохо, есть более компактные и точные формы. Тебе действительно не нужно бежать ВСЕ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...