Hallo leute,
ich steh vor einem kleine Problem.
Ich müsste mittels Regular Expression folgendes umändern
<a href="" alt="" ..> test </a>
in
[a href="" alt="" ] test [/a]
und
<img src="".../>
in
[img src=""...]
abändern.
kann mir hier jemand behilflich sein? bin leider nicht so fit in regexp. und immer wenn ich <img suche, scheitert meine abfrage wegen der spitzen klammer...?
Vielen lieben Dnak im Vorraus
Seite 1 von 1
RegExp
Anzeige
#2
geschrieben 30. Mai 2013 - 16:23
In welcher Umgebung denn?
Wenn ich das richtig rauslese, reicht es doch eigentlich schon, einfach < mit [ sowie > mit ] zu ersetzen, oder?
Die beiden Regexes könnten in etwa so aussehen:
Note: Jeder Regex gehört auf eine Zeile und geht mit s, los und hört mit ,g auf.
Die genaue Syntax hängt natürlich von der Programmierumgebung ab; wenn es wegen spezifischen Zeichen Probleme gibt, mußt Du diesen einen Escape-Character voranstellen. Normalerweise ist das der Backslash. Insbesondere gilt das für:
- Punkt .
- Klammern aller Art [, (, { sowie }, ] und )
Außerdem haben Circumflex ^, VBAR | und Minus - innerhalb von eckigen Klammern eine Sonderfunktion, erstes ganz vorn und letzeres zwischen zwei Zeichen:
- [^abc] paßt auf genau EIN Zeichen, welches weder a NOCH b NOCH c ist (das Set wird negiert)
- [a-z] paßt genau auf EIN Zeichen im Intervall a-z (einschließlich), und dementsprechend natürlich auch
- [^c-g] paßt auf genau EIN Zeichen,welches eben NICHT im Intervall von c bis g liegt (ebenfalls einschließlich.
Aber:
- [abcd^] sowie [ab^cd] passen auf a ODER b ODER c ODER d ODER ^
- [-ab] sowie [ab-] passen auf a ODER b ODER -
Die VBAR (Pipe) | trennt Optionen, wenn sie in runden Klammern steht:
- < (a|img) > paßt auf < a > und auf < img >, aber nichts anderes.
-- Eckige Klammern < und > werden NORMALERWEISE nicht speziell interpretiert, ABER (wieder je nach Programmiersprache):
- \< paßt auf einen Wortanfang, und
- \> paßt auf ein Wortende
sowie der Vollständigkeit halber
- \b paßt auf Wortgrenzen (also beides).
Für Regex sind Wortgrenzen als "Zeichen" am Anfang bzw. Ende des Worts definiert:
<A HREF="...">
hat eine Wortgrenze zwischen < und A (Wortanfang A) sowie zwischen A und dem danach folgenden Leerzeichen (Wortende A); für HREF ist der Wortanfang analog und das Wortende zwischen dem F und dem = ... und so weiter.
Wenn ich das richtig rauslese, reicht es doch eigentlich schon, einfach < mit [ sowie > mit ] zu ersetzen, oder?
Die beiden Regexes könnten in etwa so aussehen:
s,<(a)( [^>]+)>([^<]+)</\1>,[\1\2]\3[/\1],g s,<(img)( [^/]+)/>,[\1\2],g
Note: Jeder Regex gehört auf eine Zeile und geht mit s, los und hört mit ,g auf.
Die genaue Syntax hängt natürlich von der Programmierumgebung ab; wenn es wegen spezifischen Zeichen Probleme gibt, mußt Du diesen einen Escape-Character voranstellen. Normalerweise ist das der Backslash. Insbesondere gilt das für:
- Punkt .
- Klammern aller Art [, (, { sowie }, ] und )
Außerdem haben Circumflex ^, VBAR | und Minus - innerhalb von eckigen Klammern eine Sonderfunktion, erstes ganz vorn und letzeres zwischen zwei Zeichen:
- [^abc] paßt auf genau EIN Zeichen, welches weder a NOCH b NOCH c ist (das Set wird negiert)
- [a-z] paßt genau auf EIN Zeichen im Intervall a-z (einschließlich), und dementsprechend natürlich auch
- [^c-g] paßt auf genau EIN Zeichen,welches eben NICHT im Intervall von c bis g liegt (ebenfalls einschließlich.
Aber:
- [abcd^] sowie [ab^cd] passen auf a ODER b ODER c ODER d ODER ^
- [-ab] sowie [ab-] passen auf a ODER b ODER -
Die VBAR (Pipe) | trennt Optionen, wenn sie in runden Klammern steht:
- < (a|img) > paßt auf < a > und auf < img >, aber nichts anderes.
-- Eckige Klammern < und > werden NORMALERWEISE nicht speziell interpretiert, ABER (wieder je nach Programmiersprache):
- \< paßt auf einen Wortanfang, und
- \> paßt auf ein Wortende
sowie der Vollständigkeit halber
- \b paßt auf Wortgrenzen (also beides).
Für Regex sind Wortgrenzen als "Zeichen" am Anfang bzw. Ende des Worts definiert:
<A HREF="...">
hat eine Wortgrenze zwischen < und A (Wortanfang A) sowie zwischen A und dem danach folgenden Leerzeichen (Wortende A); für HREF ist der Wortanfang analog und das Wortende zwischen dem F und dem = ... und so weiter.
Dieser Beitrag wurde von RalphS bearbeitet: 30. Mai 2013 - 16:27
#3
geschrieben 30. Mai 2013 - 17:00
Hallo für deinen ausführliche Antwort.
Ich verwende PHP und hab folgendes gerüst:
funktioniert soweit aber ich kapier es leider noch tnicht ganz.
also
1) der / bezeichneit den anfang und das ende der Regexp. (hab gelesen dass hier auch andere Zeichen verwendet werden können)
2) dann wird nach "<img" gesucht.
3) für was genau ist das [^'] ?
4) * alle beliebigen Zeichen dazwischen
5) wieder wie bei Punkt 3 ?
6) * alle beliebigen Zeichen
7) null oder einmal muss > vorkommen
kannst du mir den Punkt 3 und 5 genauer erklären? das ^steht ja für anfang ... aber für was ist das ' ?
Vielen lieben dank
Ich verwende PHP und hab folgendes gerüst:
preg_match_all("/<img[^']*[^']*?>/", $foo, $array, PREG_PATTERN_ORDER);
funktioniert soweit aber ich kapier es leider noch tnicht ganz.
also
1) der / bezeichneit den anfang und das ende der Regexp. (hab gelesen dass hier auch andere Zeichen verwendet werden können)
2) dann wird nach "<img" gesucht.
3) für was genau ist das [^'] ?
4) * alle beliebigen Zeichen dazwischen
5) wieder wie bei Punkt 3 ?
6) * alle beliebigen Zeichen
7) null oder einmal muss > vorkommen
kannst du mir den Punkt 3 und 5 genauer erklären? das ^steht ja für anfang ... aber für was ist das ' ?
Vielen lieben dank
#4
geschrieben 30. Mai 2013 - 17:27
"/<img[^']*[^']*?>/"
-- <img paßt auf die Zeichenfolge
-- [^']* paßt auf eine beliebig lange Zeichenfolge (auch "gar kein Zeichen"), worin sich kein ' befindet
-- Das Ganze zu wiederholen bringt, fürchte ich, nichts, da das * "0 bis n Zeichen" quantifiziert und beide Sets gehen ineinander auf. Was Du möchtest, ist ein + statt des * für "1 oder mehr Zeichen".
-- Das ?> beißt hier. Das Tag schließt den PHP-Interpreter; hier mußt Du Dir was einfallen lassen, wie Du diese Zeichenkombination vermeidest. Außerdem ist es ein Syntaxfehler im Regex, weil es kein Zeichen gibt, welches quantifiziert wird.
-- Ein einzelnes + oder * oder ? gibt es nicht. Diese quanzifizieren IMMER das Zeichen bzw. die Zeichenmenge unmittelbar DAVOR. Wenn Du ein beliebiges Zeichen haben willst, brauchst Du einen Punkt . - diesen kannst Du dann quantifizieren:
-- . = genau EIN beliebiges Zeichen
-- .? = KEIN oder EIN beliebiges Zeichen
-- .* = KEIN oder MEHR beliebige(s) Zeichen
-- .+ = EIN oder MEHR beliebige(s) Zeichen
Frage ist natürlich, wie genau der Regex passen soll: reicht es, oder reicht es nicht, wenn < durch [ sowie > durch ] ersetzt werden? Wenn nicht, brauchst Du Kontext (siehe weiter oben) wie zB /<img/, damit Du genau(!) das IMG-Tag kriegst und nicht bspw. das P oder oder H1 oder sonst eines.
Note! preg_match_all() ist NICHT gleich preg_replace()!
-- <img paßt auf die Zeichenfolge
-- [^']* paßt auf eine beliebig lange Zeichenfolge (auch "gar kein Zeichen"), worin sich kein ' befindet
-- Das Ganze zu wiederholen bringt, fürchte ich, nichts, da das * "0 bis n Zeichen" quantifiziert und beide Sets gehen ineinander auf. Was Du möchtest, ist ein + statt des * für "1 oder mehr Zeichen".
-- Das ?> beißt hier. Das Tag schließt den PHP-Interpreter; hier mußt Du Dir was einfallen lassen, wie Du diese Zeichenkombination vermeidest. Außerdem ist es ein Syntaxfehler im Regex, weil es kein Zeichen gibt, welches quantifiziert wird.
-- Ein einzelnes + oder * oder ? gibt es nicht. Diese quanzifizieren IMMER das Zeichen bzw. die Zeichenmenge unmittelbar DAVOR. Wenn Du ein beliebiges Zeichen haben willst, brauchst Du einen Punkt . - diesen kannst Du dann quantifizieren:
-- . = genau EIN beliebiges Zeichen
-- .? = KEIN oder EIN beliebiges Zeichen
-- .* = KEIN oder MEHR beliebige(s) Zeichen
-- .+ = EIN oder MEHR beliebige(s) Zeichen
Frage ist natürlich, wie genau der Regex passen soll: reicht es, oder reicht es nicht, wenn < durch [ sowie > durch ] ersetzt werden? Wenn nicht, brauchst Du Kontext (siehe weiter oben) wie zB /<img/, damit Du genau(!) das IMG-Tag kriegst und nicht bspw. das P oder oder H1 oder sonst eines.
Note! preg_match_all() ist NICHT gleich preg_replace()!
Thema verteilen:
Seite 1 von 1