Frage

Ich möchte alle URLs schneiden wie ( http:. // ... ) und ersetzen Sie sie auf Anker <a></a> aber meine Forderung: Berühren Sie keine Anker und Seitendefinition (Dok-Typ) wie:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

Also brauche ich nur Klartext mit URLs zu finden ...

Ich versuche, meine Render innerhalb Seite außer Kraft zu setzen und ich machte BrowserAdapter:

<browser refID="default">
    <controlAdapters>
        <adapter controlType="System.Web.Mvc.ViewPage"
                 adapterType="Facad.Adapters.AnchorAdapter" />
    </controlAdapters>
</browser>

es sieht wie folgt aus:

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);
    }
}
War es hilfreich?

Lösung

Sie müssen nur vor ein wenig suchen und hinter der URL zu sehen, ob es in Anführungszeichen ist, ist es unwahrscheinlich, jemand zitierte url als Plain-Text einfügen würde, aber URLs werden immer in Tags und doctypes zitiert. So Ihre regex wird:

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

(^ | [^ ' "] +) bedeutet Beginn der Zeichenfolge oder ein Zeichen, das kein Zitat ist ([^ ' "] | $) Bedeutet Ende der Zeichenfolge oder kein Zitat

Die zusätzlichen Klammern um den alten regex sicherzustellen, dass es eine Capture-Gruppe ist, so dass Sie die tatsächliche URL mit \ 2 abrufen können (Gruppe 2) statt den zusätzlichen Mist bekommt es an den Rand der URL angepasst haben könnte

BTW, Ihre URL Regex sieht ziemlich schlecht, es ist kompakter und präzise Formen. Sie müssen wirklich nicht alles entkommen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top