a-Tags mit Regex formatieren (PHP)

S

sideshow

Mitglied
Thread Starter
Dabei seit
24.01.2005
Beiträge
92
Reaktionspunkte
0
Schönen guten Morgen (wenn er doch nur schön wäre...),

kurze Frage:
Ich habe in einem String irgendwo einen a-Tag stehen der immer etwas unterschiedlich aussehen kann (mal mit, mal ohne css class Attribut).

Gehen wir mal von diesem Beispiel aus:
Code:
Hier steht einiges an Text <a class="lift" href="http://www.sueddeutsche.de/ausland/special/821/index.html">Linktext steht hier</a> und hier dahinter auch...

Ich möchte nun das der Link "ersetzt" wird und zwar in dieser Form:

Code:
Hier steht einiges an Text Linktext steht hier (http://www.sued...) und hier dahinter auch...

Also soll das href Attribut rausgenommen werden und in Klammern nach dem Linktext angefügt werden. Leider bin ich was reguläre Ausdrücke angeht nicht besonders gut - die wollen mir einfach nicht in den Kopf. Evtl. kennt sich hier jemand besser damit aus? Wäre super.

Wie ich den gesamten Link-Tag wegschmeisse und nur an den "Linktext" komme ist kein Problem - soweit hab ich es schon, nur möchte ich eben das href-Attribut anfügen.

Also das hier hab ich:
Code:
$atext = preg_replace("!\<a(.*?)\>!", "", $atext);

Vielen Dank schon mal im Voraus!
 
Wirf mal einen Blick in die php-FAQ, speziell hier und hier
 
  • Gefällt mir
Reaktionen: sideshow
Mh... das hier habe ich mir jetzt zusammengebastelt. Funktioniert einwandfrei!

Code:
$pattern  = ',<a([^>]+)href="(.*?)([^>"\s]+)">(.*?)</a>,i';
$replacement = '\4 (\3)';
$atext = preg_replace($pattern, $replacement, $atext);

Gibt es evtl. noch eine elegantere Lösung? Nur so rein interessehalber... bin aber sonst sehr zufrieden damit! :)
 
Eleganter gehts wohl nicht.

Ein kleiner Verbesserungsvorschlag aber:
Code:
,<a[COLOR="Magenta"]([/COLOR][^>]+[COLOR="Magenta"])[/COLOR]href="[COLOR="Red"](.*?)[/COLOR]([^[COLOR="Magenta"]>[/COLOR]"[COLOR="Magenta"]\s[/COLOR]][COLOR="Lime"]+[/COLOR])">(.*?)</a>,i
Das rot markierte ist überflüssig, wird niemals irgend etwas matchen. Das lila markierte macht keinen Unterschied. Würde ich der Performance halber raus nehmen. Das grün markierte + könnte man durch ein * ersetzen. Dann werden auch a-Tags ohne Link im href gefunden, falls das mal vorkommt und falls Du das möchtest.

Dann sieht der Ausdruck noch so aus.
Code:
,<a[^>]+href="([^"]*)">(.*?)</a>,i
Die Referenzen der Treffer wären dann \1 und \2.

Eine Frage noch. Hast Du wirklich nur einen solchen Link pro Textschnipsel? Wenn das ganze z.B. eine per file() eingelesene Datei ist und du das Array komplett durchgehst um in jeder Zeile einen Link zu verändern...das wäre recht performancehungrig. Ich würde in so einem Fall das Array auf eine Ebene bringen und den gesammten String dann preg_replace mit dem m-Modifier drüberjagen. Dann hast Du alles in einem Rutsch gemacht und der Server wird es Dir danken. :)
 
  • Gefällt mir
Reaktionen: sideshow
Hi dms,

vielen Dank erst mal für das Feedback! Klingt gut... ist schon echt komisch - ich hab schon so viel Bücher gewälzt aber die reg. Ausdrücke wollen mir einfach nicht ganz im Kopf hängenbleiben! :D

Der Text kommt aus der Datenbank. Im Text können sich durchaus mehrere Links befinden. Nach dem diese Funktion die den Text bzw. die Links so konvertiert nur unter gewissen Umständen aufgerufen wird und auch nicht sehr oft habe ich da kein Problem mit der Performance.

Neugierig bin ich jetzt aber trotzdem wie ich das besser lösen könnten - also mit dem m-modifier wie du das geschrieben hast. Leider hab ich's nicht kapiert um ehrlich zu sein!:D:kopfkratz:
 
Zurück
Oben Unten