Wie richtig Regex für Urls auf der Seite ohne Anker zu schreiben?
-
22-08-2019 - |
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\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?", 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);
}
}
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\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?)([^'"]+|$)
(^ | [^ ' "] +) 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.