Seite 1 von 1
Regular Expression
Verfasst: 12.06.2009 17:56
von gnasen
Hi, ich bin selber nicht sehr begabt in RegExp und bräuchte einmal Hilfe bei einem Wahrscheinlich total trivialen Problem:
Ich möchte folgenden String matchen:
und nutze folgenden Pattern:
Er matcht mir allerdings:
test</a><a>test2
ich möchte aber:
test und
test2
Hat jemand eine Idee?
Verfasst: 12.06.2009 18:19
von STARGÅTE
.* bedeutet alles in beliebiger Länge, und RegExp arbeitet immer so:
Das größte zuerst!
Also machs so:
Du verhinderst du das er < oder > im match hat
Verfasst: 12.06.2009 18:33
von gnasen
das funktioniert schonmal ganz gut.
Als nächstes hakt es hier:
<a bla=test> blub <\a>
blub soll in der "Gruppe" a trotzdem noch gematch werden. Aber irgendwie mag das nicht.
Ich weiss nicht, wie ich das noch zusätzlich eingebaut bekommen soll, sodass der Match immer noch funktioniert.
Ich komme damit einfach nicht zurecht Danke schonmal soweit für die Hilfe
Verfasst: 12.06.2009 18:38
von STARGÅTE
naja da würde ich das ähnlich machen:
lasse nach einen Tag einfach jedes zeichen noch mal zu außer das >
Also das er <a...> zulässt ...
Nun hält er sich noch an die Tags (also das a am anfang und ende) aber was nach dem a innerhab der <> kommt ist ihm egal ...
PS: Diese Lösungen beruhen alle auf meiner Erfahrung, hab sie also nicht weiter getestet ... ich hoffe es geht ...
Ich hoffe als nächstet willst du nicht noch die Flags der Tags auslesen ^^
Verfasst: 12.06.2009 18:46
von gnasen
Ich hatte fast 1 zu 1 die Gleiche Idee, das Problem, sowohl deine als auch meine Lösung funktionieren nicht.
Der Matched die a Gruppe dann gar nicht mehr
Verfasst: 12.06.2009 18:58
von STARGÅTE
also in PB zB gehts:
Code: Alles auswählen
If CreateRegularExpression(0, "<(\w+)[^>]*>([^<>]*)</\1>")
Dim Result$(0)
NbFound = ExtractRegularExpression(0, "<a href='hier'>Laber</a><a>Laber2</a>", Result$())
For k = 0 To NbFound-1
Debug Result$(k)
Next
Else
Debug RegularExpressionError()
EndIf
Allerdingt kann ich mit PB ja leider nicht auf die Klammern alleine zugreifen ... aber Findent tut er es.
Also solltest du in PHP oder so, wo du ja ein Array bekommst mit den Feld 2 auf das innere zugreifen können ...
ansonsten schick mal das Codeausschnitt ...
Verfasst: 12.06.2009 19:34
von STARGÅTE
Habe eben noch in php was zusammen gebastelt:
http://data.unionbytes.de/preg.php
Gebe dort dein text oben ein:
<a href='hier'>Laber</a><a>Laber2</a>
und bei Pattern dann den "echten":
Ich erhalte dabei:
1. Treffer
String : <a href='hier'>Laber</a>
- Teil 1 : a
- Teil 2 : Laber
2. Treffer
String : <a>Laber2</a>
- Teil 1 : a
- Teil 2 : Laber2
Re: Regular Expression
Verfasst: 12.06.2009 21:59
von AND51
gnasen hat geschrieben:Ich möchte folgenden String matchen:
ich möchte aber:
test und
test2
STARGATE hat doch gesagt, RegExps nehmen "immer das größere zuerst", der Fachkundige nennt das auch "Gieriges Suchmuster" (von englisch "greedy pattern").
Stelle dem ganzen Ausdruck ein
(?U) voran, um ein "genügsames Suchmuster" ("ungreedy pattern") zu erhalten.
Das Suchmuster hier matcht immer genau
einen Link nach dem anderen:
Code: Alles auswählen
(?U)\<(a|A)(|\s.+)\>(.*)\</<(a|A)>
----
|___________ Der Textinhalt des Links
Ungetestet, hab ich aus dem Kopf so hingeschrieben.
Dazu noch folgenden Tipp:
Um Substrings zu extrahieren musst du die RegExp-Funktionen irgendwie aus den PB-Libs importieren.
ich weiß, dass edel weiß, wie das geht, auswendig weiß ich das gerade nicht mehr.
Musst ihn mal fragen oder hier im Forum suchen.