2009-08-22 5 views
3

Es gibt viele Regex-Einträge, die einer URL entsprechen. Ich versuche jedoch URLs zu finden, die nirgends innerhalb eines <a> Hyperlink-Tags (HREF, innerer Wert usw.) angezeigt werden. So KEINE der URLs in diese sollten übereinstimmen:Regulärer Ausdruck, um URLs zu finden, die sich nicht in einem Hyperlink befinden

 
<a href="http://www.example.com/">something</a> 
<a href="http://www.example.com/">http://www.example2.com</a> 
<a href="http://www.example.com/"><b>something</b>http://www.example.com/<span>test</span></a> 

Jede URL außerhalb von <a></a> angepasst werden sollte.

Ein Ansatz war ich versuchte, eine negative Vorschau zu verwenden, wenn der erste <a> Tag nach der URL, um zu sehen </a> eine Öffnung <a> oder eine Schließung ist. Wenn es sich um eine schließende </a> handelt, muss sich die URL in einem Hyperlink befinden. Ich denke, diese Idee war in Ordnung, aber die negative Lookahead Regex hat nicht funktioniert (oder genauer gesagt, die Regex wurde nicht richtig geschrieben). Irgendwelche Tipps werden sehr geschätzt.

+0

Welche Plattform? Perl, .NET oder Java? –

+0

mögliches Duplikat von [Wie man Text in einen Hyperlink NUR umschließt, wenn er nicht bereits in einen Hyperlink eingeschlossen ist] (http://stackoverflow.com/questions/1191637/how-to-wrap-text-in-a-hyperlink -only-wenn-es-nicht-bereits-in-einem-Hyperlink eingewickelt) – tchrist

Antwort

2

Sie können es in zwei Schritten zu tun, anstatt mit einem einzigen regulären Ausdruck zu kommen versuchen:

  1. Mischung aus (ersetzen Sie mit nichts) dem HTML-Anker-Teil (der gesamte Anker-Tag: öffnende Tag, Inhalt und schließendes Tag).

  2. Spiel der URL

In Perl könnte es sein:

my $curLine = $_; #Do not change $_ if it is needed for something else. 
$curLine =~ /<a[^<]+<\/a>//g; #Remove all of HTML anchor tag, "<a", "</a>" and everything in between. 
if ($curLine =~ /http:\/\//) 
{ 
    print "Matched an URL outside a HTML anchor !: $_\n"; 
} 
+0

Wenn ich die HTML-Anker entfernen (ausblendung), kann ich nicht feststellen, ob die URL ursprünglich in einem Hyperlink war, richtig? Ich suche nur nach URLs außerhalb der Hyperlink-Tags. –

+0

Ich meine: Entferne * alles * vom Anfangsanker-Tag bis zum schließenden Anker-Tag. –

+0

Ah, großartige Lösung. Ich habe es funktioniert. Zuerst dachte ich, Sie wollten nur die Anfangs- und Endtags entfernen, aber das Entfernen des ganzen Tags war der Trick. Vielen Dank!! –

0

Sie tun können, dass eine einzige reguläre Ausdrücke verwenden, die beide Anker-Tags und Hyperlinks matches:

# Note that this is a dummy, you'll need a more sophisticated URL regex 
regex = '(<a[^>]+>)|(http://.*)' 

Dann Schleife über die Ergebnisse und verarbeitet nur Übereinstimmungen, wo das zweite Untermuster gefunden wurde.

+0

Dies funktioniert nur für die URLs innerhalb des Tags, nicht für die innerhalb eines Elements . Außerdem wird versucht, eine nicht reguläre Sprache mit regulären Ausdrücken zu analysieren. – Svante

+0

@Svante: Zuerst können Sie das Beispiel einfach erweitern, um alles innerhalb und übereinzustimmen. Dann macht es dasselbe wie die angenommene Antwort, nur in einem einzigen Durchgang. Zweitens, nein, "es" versucht nicht, irgendetwas anderes als eine reguläre Sprache basierend auf dem Auftreten von HTML-ish-Strings zu parsen. Sie brauchen keinen HTML-Parser mit allen Funktionen, wenn Sie nur ein einfaches Muster in der Zeichenfolge suchen möchten. –

0

Peter hat eine große Antwort: Erstens, Anker zu entfernen, so dass

Some text <a href="http://page.net">TeXt</a> and some more text with link http://a.net 

von

Some text and some more text with link http://a.net 

DANN ersetzt ein regexp ausführen, die Urls findet:

http://a.net 
0

Verwenden Sie die DOM, um die Ankerelemente herauszufiltern, dann führe einen einfachen URL-Regex auf den Rest aus.

Verwandte Themen