BBCode (RegEx) Frage

Warper

Erfahrenes Mitglied
Hi!

Ich möchte in einem String folgenden BBCode in einen Link umwandeln:

Code:
[inhaltlink|artikel|2]Text[/inhaltlink]

Gewünschtes Ergebnis:
http://www.seite.de/artikel.php?artikel_id=2

Das "Problem" (für mich) ist zum einen die dafür wahrscheinlich nötige RegEx, vor allem aber das ein solcher BBCode eben beliebig oft vorkommen kann. Ich stehe, was die Lösung angeht, etwas auf dem Schlauch. Könnt ihr mir weiterhelfen?

Grüße,
Steffen
 
Zuletzt bearbeitet:
Code:
\[inhaltlink\|([^|]+)\|/([^\]]+)\].+?\[/inhaltlink\]

Danke, hast du auch noch einen Tipp für mich, wie ich mein Problem in PHP am geschicktesten umsetze?

Kurze Frage nebenbei, was hinder dich daran, denk Link einfach richtig zu speichern? Also direkt http://www.seite.de/artikel.php?artikel_id=2

Hauptsächlich aus zwei Gründen:

1. Ich möchte "meinen" Redakteuren nicht zumuten einen Link herauszusuchen.

2. Der sehr viel entscheidendere Grund ist, dass ich keine Links auf mein eigenes System im Plaintext in der Datenbank stehen haben möchte. Wenn dann irgendwann einmal die Struktur der Seite etwas geändert wird, muss ich alle Tupel durchschauen, und die Links nachträglich verändern. So müsste ich nur eine Codestelle in meinem Parser anpassen.

Grüße,
Steffen
 
Hey, hab mich etwas schlau gemacht und dürfte dem Problem nun Herr werden.


Aber ich hab ein neues Problem mit einer RegEx. Ich versuche alle Bilder einer HTML in ein Array zu packen.

Ich lese die Datei zunächst ein, und durchlaufe sie dann mit preg_match_all();

Aber könnt ihr mir sagen, was an folgender RegEx falsch ist?

PHP:
<img.+src=[\"|\']([^[\"|\']*])[\"|\'].+>

Danke,
Steffen
 
Probier mal Folgendes:
PHP:
preg_match_all('/<img.+src=(["\']?)([^\1]+)\1[^>]*>/', $string, $matches)
 
Hi, funktioniert leider nicht.

Ergebnis:

PHP:
Array
(
    [0] => Array
        (
            [0] => <img alt="hallo" src="http://www.autohochzwei.de/gfx/ueber_uns_dbartels.jpg" /><br />
<img src="http://www.autohochzwei.de/gfx/ueber_uns_sbehn.jpg" /><br />
<img src="http://www.autohochzwei.de/gfx/ueber_uns_mschuler.jpg" /><br />
<img src="http://www.autohochzwei.de/gfx/ueber_uns_hwilke.jpg" /><br />
<img src="http://www.autohochzwei.de/gfx/ueber_uns_hwilke.jpg" />
        )

    [1] => Array
        (
            [0] => "
        )

    [2] => Array
        (
            [0] => http://www.autohochzwei.de/gfx/ueber_uns_dbartels.jpg" /><br />

<img src="http://www.autohochzwei.de/gfx/ueber_uns_sbehn.jpg" /><br />
<img src="http://www.autohochzwei.de/gfx/ueber_uns_mschuler.jpg" /><br />
<img src="http://www.autohochzwei.de/gfx/ueber_uns_hwilke.jpg" /><br />
<img src="http://www.autohochzwei.de/gfx/ueber_uns_hwilke.jpg
        )

)

Geparster quelltext: http://www.autohochzwei.de/test_bilderseite.html

Meine Zeile:

PHP:
preg_match_all('/<img.+src=(["\']?)([^\1]+)\1[^>]*>/', $pageContent, $result);

Könntest du mir auch ein wenig erklären?

  • Wofür steht zum Beispiel der Slash am Anfang und am Ende?
  • Das .+ steht für beliebig viele Zeichen (richtig?)
  • Das (["\']?) steht für ein Zeichen ", oder ' (richtig?) wofür steht da das ? Die Runden Klammern sorgen dafür, dass der Wert gespeichert wird, innerhalb der Klammer
  • Das ([^\1]+) sollte eigentlich für den Wert des src Attributs stehen, oder? Aber ([^\1]+) steht doch für, beliebig viele Zeichen außer \ und außer der 1 (richtig?)
  • \1[^>]*>/ - Da steige ich nun wirklich aus, nur dass du mit [^>] halt so lange suchst, wie kein > vorkommt. (richtig?) Aber wofür steht das > vor dem / zum Schluss.

Wäre echt cool, wenn du mir "etwas" helfen könntest.

Grüße
 
Die Zeichen „?“, „*“ und „+“ sind Quantoren, die bestimmen, dass der vorhergehenden Term keinmal oder einmal, keinmal oder beliebig oft beziehungsweise einmal oder beliebig oft wiederholt vorkommen darf. Ein „["']?“ bedeutet also, dass das „"“- oder das „'“-Zeichen einmal oder keinmal vorkommen darf.
Das „\1“ ist eine Rückreferenz und wird innerhalb des regulären Ausdrucks durch den Wert der ersten Gruppierung (in diesem Fall das „(["']?)“ ersetzt. Der Ausdruck „[^\1]+“ wird also je nach Fall zu „[^"]+“, „[^']+“ oder aber „[^]+“.
 
Hi,

ich mache das ganze jetzt iterativ, damit erziele ich die besten Ergebnisse. Geht natürlich auch eleganter, aber solange ich mich nicht 100% mit regex auskenne, ist es so besser und sicherer.


Ich holf mir zunächst alle gesamtem <img> Tags der Seite. Diese überprüfe ich dann erneut nach src, width, height und alt.

Das funktioniert mit allen vernünftigen seiten (Konform mit src="..." oder wenigstens src='...') auch wunderbar, aber wie kann ich vorgehen, wenn jemand <img src=...> verwendet?

Meine aktuelle regex ist ganz simpel gehalten:

/[Ss][Rr][Cc]=["\'](.*?)["\']/

Hat jemand von euch eine Idee, wie ich die so anpasse, dass ich auch src=... abdecke? Das Problem ist ja vor allem, das es unbestimmt ist, was nach der src_url kommt - da kann ein Leerzeichen kommen, da kann ein > komment und noch vieles mehr ;)

Grüße,
Steffen
 
Zurück