![]() |
[php] Mehrere Strings ersetzen schlägt fehl
Hallo,
Ich habe hier ein für mich unverständliches Problem mit php: Ich habe eine Variable $line in der z.B. folgendes steht:
Code:
nun möchte ich alle url-Tags durch entsprechende HTML-Tags ersetzen.
Ob [url=index.php?id=1]1[/url], [url=index.php?id=2]2[/url], [url=index.php?id=3]3[/url]
Zuerst also mit einem nur:
PHP-Quellcode:
Super! Es funktioniert, aber jetzt kommt es:
$p=strpos($line,"[url=");
if (($p<>null) or (substr($line,0,5)=="[url=")) { $s=substr($line,$p+5,strpos($line,']')-$p-5); $line=str_replace("[url=".$s."]", "<a href=\"".$s."\">", $line); } Man sollte ja annehmen das wenn ich das ganze 2x hintereinander schreibe:
PHP-Quellcode:
Der das auch mit dem 2. macht, ist aber nicht so!
$p=strpos($line,"[url=");
if (($p<>null) or (substr($line,0,5)=="[url=")) { $s=substr($line,$p+5,strpos($line,']')-$p-5); $line=str_replace("[url=".$s."]", "<a href=\"".$s."\">", $line); } $p=strpos($line,"[url="); if (($p<>null) or (substr($line,0,5)=="[url=")) { $s=substr($line,$p+5,strpos($line,']')-$p-5); $line=str_replace("[url=".$s."]", "<a href=\"".$s."\">", $line); } Wobei ich doch aber den 1. Tag ersetzt habe wodurch dieser nicht mehr da sein sollte → es wird der nächste gefunden. da frage ich mich: warum macht der nicht das was man erwartet? Und: wie kann ich beliebig viele davon ersetzen? |
AW: [php] Mehrere Strings ersetzen schlägt fehl
Ohne, dass ich mir jetzt dein Skript genauer angeschaut habe:
Normalerweise eignen sich für sowas wunderbar sog. "Regular Expressions". Ein Beispiel:
Code:
mfg
$text = preg_replace("/\[url=(.*)\](.*)\[\/url\]/Usi", "<a href=\"\\2\">\\3</a>", $text);
Patrick |
AW: [php] Mehrere Strings ersetzen schlägt fehl
Du kannst doch in PHP auch
![]() Schreib Dir eine Funktion, dass eine Ersetzung ausführt. Und vergiss nicht einen schönen, ausführlichen Kommentar vor die Funktion zu schreiben. Ohne Kommentar wirst du deinen eigenen Code in 2 Monaten nicht mehr verstehen! |
AW: [php] Mehrere Strings ersetzen schlägt fehl
Zitat:
PHP-Quellcode:
Jedoch wird jetzt aus
$line= preg_replace("/\[url=(.*)\]/Usi", "<a href=\"\\2\">", $line);
Code:
ein
[url=index.php?id=2]
HTML-Code:
und zwar bei allen vorkommenden url-Tags.
<a href="index.php">
Was ist da noch falsch? |
AW: [php] Mehrere Strings ersetzen schlägt fehl
Zitat:
|
AW: [php] Mehrere Strings ersetzen schlägt fehl
OK, ich habe jetzt herausgefunden dass das ? eine besondere Rolle bei regex einnimmt, Jedoch stellen sich mir 2 Fragen:
Wie bekomme ich das hin dass der das ? als normales Zeichen wertet? Und es muss ja nicht einmal unbedingt ein ? im Link vorkommen, wie behandelt man dass dann? Edit: Das funktioniert jetzt:
PHP-Quellcode:
//für asd?dsa
$line= preg_replace("/\[url=(.*)\?(.*)\]/U", "<a href=\"\\1?\\2\">", $line); //für asd $line= preg_replace("/\[url=(.*)\]/U", "<a href=\"\\1\">", $line); |
AW: [php] Mehrere Strings ersetzen schlägt fehl
Zitat:
Zitat:
* bedeutet, der Ausdruck ist optional |
AW: [php] Mehrere Strings ersetzen schlägt fehl
Man könnte auch die Zeichenklasse erweitern wenn das ? nicht enthalten ist:
Code:
Was der . schon alles abdeckt habe ich leider grad nicht im Kopf, aber so ungefähr sollte es gehen ;)
$line= preg_replace("/\[url=([._\-\?\+#]*)\]/Usi", "<a href=\"\\2\">", $line);
|
AW: [php] Mehrere Strings ersetzen schlägt fehl
Du willst doch einfachen BBCode parsen, oder? - Dafür gibt es bereits fertige Klassen, die das für dich erledigen. Ich verwende eine, bei der du gleich schon den Parameter extrahiert bekommst und gleichzeitig auf den Inhalt zwischen Start-Tag und End-Tag zugreifen kannst. So hast du wenigstens nicht das Problem, dass in deinem BBCode falsch verschachtelt wird.
Momentan prüfst du nur auf das Start-Tag. Das Endtag wird bei dir nicht beachtet, was eigentlich nicht richtig ist. Bernhard PS: Ich benutze diese Klasse: ![]() |
AW: [php] Mehrere Strings ersetzen schlägt fehl
Na, wenn's darum geht. Ich nutze
![]() Beispiele zur Verwendung gibt's ![]() Ich testete auch die Klasse von Christian Seiler, doch es gab da irgendetwas, das mich gewaltig störte bzw. damit nicht möglich war. Frag mich aber bitte nicht mehr was. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz