2009-03-04 22 views
1

Ich versuche, das/s in einem a-Tag-Text zu padieren.Suchen und Ersetzen von Textinhalt eines Tags

1234/1234/ABCDE => 1234/1234/ABCDE 

Im Zusammenhang; wenn ich ein ein Tag haben:

<a href="http://www.domain.com/path/to/page.html">12 34/1234A/BC DEFG</a> 

Ich möchte bekommen:

<a href="http://www.domain.com/path/to/page.html">12 34/1234A/BC DEFG</a> 
+0

Sprache? sind Sie auf die Client-Seite beschränkt, Javascript? – alex

Antwort

2

Diese Regex sollte es tun:

(\s*/\s*(?=[^<>]+<)) 

Es wird nur die '/' innerhalb Tags und nicht URLs ersetzen.

In C#:

myHtml = Regex.Replace(myHtml, @"(\s*/\s*(?=[^<>]+<))", "/"); 

In Perl:

$myHtml =~ s!(\s*/\s*(?=[^<>]+<))!/!g; 

In JavaScript:

myHtml = myHtml.replace(/(\s*\/\s*(?=[^<>]+<))/g, "/"); 

Hinweis:

in diesen Beispielen die Das gesamte Dokument muss in den String myHtml geladen werden.
Wenn Sie an einer einzelnen Zeile gleichzeitig arbeiten, wird es natürlich nicht funktionieren, wenn es neue Zeilen innerhalb der Tags oder dazwischen Tag-Paare gibt.

+0

Das funktioniert perfekt, danke! Versuche immer noch, meinen Kopf darum zu wickeln! ;) –

+0

Der Regex hat einen positiven Lookahead, um nur diejenigen zu treffen, die gefolgt von und öffnende Tag-Klammer sind. Wenn sich das/in einer URL befindet, wird es nicht übereinstimmen, da es von einer schließenden Tag-Klammer gefolgt wird. –

+0

Es wird nicht funktionieren, wenn das schließende Tag in einer anderen Zeile ist. Es kann oder kann kein Problem sein, aber Sie sollten es zumindest dokumentieren. – mirod

0

Welche Sprache? Versuchen Sie in Perl s/\// \/ /g.

+0

Das würde seine URLs vermasseln. Ich glaube nicht, dass er das will. –

3

Das ist nicht wirklich die Art von Sache, die reguläre Ausdrücke gut sind. Sie werden wahrscheinlich besser einen HTML- oder XML-Parser verwenden - er erstellt eine Baumstruktur mit Knoten aus dem Dokument und Sie können dann einfach alle Textknoten innerhalb von Tags durchgehen und nach Bedarf Leerzeichen hinzufügen.

0

Ich denke, dass wir hier ein wenig Kontext fehlt. Sind die Daten HTML, XML oder nur Textfragmente mit Tags?

Wenn es HTML oder XML ist, wie oft erwähnt, sind Regexps nicht sicher, es sei denn, Sie kontrollieren genau das Format der Daten, und Sie wissen, dass Sie es immer kontrollieren werden. Und du dokumentierst es.

Ich würde einen passenden Parser verwenden, wenn ich du wäre. Wenn Sie Perl und XML :: Zweig installiert, die folgenden Einzeiler tun:

perl -MXML::Twig -e'XML::Twig->parse(keep_spaces => 1, "my_file.xml")->subs_text("/", "/")->print' 

Wenn Sie sich mit gut ausgebildeten XML ohne Kommentare und keine CDATA-Abschnitte zu tun, dann eine effizientere Art und Weise würde sein PYX zu verwenden (Sie müssen XML installieren :: PYX):

pyx my_file.xml | perl -p -e's{/}{/}g if m{-}' | pyxw 
+0

Danke für den Tipp zur Verwendung von TWIG! –

+0

Kein Problem, wenn man bedenkt, dass ich XML :: Twig geschrieben habe, könnte es sogar als schamloser Plug betrachtet werden; -) – mirod

0

Wenn es nötig ist, können Sie einen regulären Ausdruck versuchen Sie es mit den Text zwischen zwei Variablen zu extrahieren und dann Prozess, und dann re- Fügen Sie es ein, aber diese Aufgabe ist wahrscheinlich komplizierter als eine einzelne Regex aufgrund Ihrer Einschränkungen.

Hier ist etwas in Perl, das funktioniert (aber verwendet reguläre Ausdrücke nicht):

my (@a, $in_tag); 
foreach(split //, $string) { # assuming $string holds our string 
    $in_tag = 1 if $_ eq "<"; 
    $in_tag = 0 if $_ eq ">"; 
    if($_ eq "/" and not $in_tag) { 
    push @a, " ", "/", " "; 
    } 
    else { 
    push @a, $_; 
    } 
} 
$string = join "", @a; 

Dies ist jedoch nicht ein regulärer Ausdruck, sondern ein sehr einfacher Parser.