WinFuture-Forum.de: RegExp - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

RegExp


#1 Mitglied ist offline   Party 

  • Gruppe: aktive Mitglieder
  • Beiträge: 501
  • Beigetreten: 16. Januar 04
  • Reputation: 0

geschrieben 30. Mai 2013 - 14:08

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
0

Anzeige



#2 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.902
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

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? :unsure:


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

"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

#3 Mitglied ist offline   Party 

  • Gruppe: aktive Mitglieder
  • Beiträge: 501
  • Beigetreten: 16. Januar 04
  • Reputation: 0

geschrieben 30. Mai 2013 - 17:00

Hallo für deinen ausführliche Antwort.
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
0

#4 Mitglied ist offline   RalphS 

  • Gruppe: VIP Mitglieder
  • Beiträge: 8.902
  • Beigetreten: 20. Juli 07
  • Reputation: 1.126
  • Geschlecht:Männlich
  • Wohnort:Zuhause
  • Interessen:Ja

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? :unsure: 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()!
"If you give a man a fish he is hungry again in an hour. If you teach him to catch a fish you do him a good turn."-- Anne Isabella Thackeray Ritchie

Eingefügtes Bild
Eingefügtes Bild
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0