Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [php] Mehrere Strings ersetzen schlägt fehl (https://www.delphipraxis.net/155768-%5Bphp%5D-mehrere-strings-ersetzen-schlaegt-fehl.html)

Teekeks 7. Nov 2010 14:00

[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:
Ob [url=index.php?id=1]1[/url], [url=index.php?id=2]2[/url], [url=index.php?id=3]3[/url]
nun möchte ich alle url-Tags durch entsprechende HTML-Tags ersetzen.
Zuerst also mit einem nur:
PHP-Quellcode:
   $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);
   }
Super! Es funktioniert, aber jetzt kommt es:

Man sollte ja annehmen das wenn ich das ganze 2x hintereinander schreibe:
PHP-Quellcode:
   $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);
   }
Der das auch mit dem 2. macht, ist aber nicht so!
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?

patti 7. Nov 2010 14:09

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:
$text = preg_replace("/\[url=(.*)\](.*)\[\/url\]/Usi", "<a href=\"\\2\">\\3</a>", $text);
mfg
Patrick

sx2008 7. Nov 2010 14:11

AW: [php] Mehrere Strings ersetzen schlägt fehl
 
Du kannst doch in PHP auch Funktionen erstellen (ich hoffe das hast du schon entdeckt).
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!

Teekeks 7. Nov 2010 14:18

AW: [php] Mehrere Strings ersetzen schlägt fehl
 
Zitat:

Zitat von patti (Beitrag 1060213)
Ohne, dass ich mir jetzt dein Skript genauer angeschaut habe:
Normalerweise eignen sich für sowas wunderbar sog. "Regular Expressions".

Ein Beispiel:

Code:
$text = preg_replace("/\[url=(.*)\](.*)\[\/url\]/Usi", "<a href=\"\\2\">\\3</a>", $text);
mfg
Patrick

Ich hab es jetzt so:
PHP-Quellcode:
$line= preg_replace("/\[url=(.*)\]/Usi", "<a href=\"\\2\">", $line);
Jedoch wird jetzt aus
Code:
[url=index.php?id=2]
ein
HTML-Code:
<a href="index.php">
und zwar bei allen vorkommenden url-Tags.

Was ist da noch falsch?

Luckie 7. Nov 2010 14:21

AW: [php] Mehrere Strings ersetzen schlägt fehl
 
Zitat:

Zitat von sx2008 (Beitrag 1060214)
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!

Um das ganze noch unübersichtlicher zu machen? Lieber einen aussagekräftigen Namen nehmen.

Teekeks 7. Nov 2010 14:42

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);

Matze 7. Nov 2010 15:14

AW: [php] Mehrere Strings ersetzen schlägt fehl
 
Zitat:

Zitat von Teekeks (Beitrag 1060221)
Wie bekomme ich das hin dass der das ? als normales Zeichen wertet?

Reservierte Zeichen musst du in dem Fall escapen, also einen Backslash voranstellen: \?
Zitat:

Zitat von Teekeks (Beitrag 1060221)
Und es muss ja nicht einmal unbedingt ein ? im Link vorkommen, wie behandelt man dass dann?

+ bedeutet, der Ausdruck muss mind. 1 x vorkommen
* bedeutet, der Ausdruck ist optional

jfheins 7. Nov 2010 15:19

AW: [php] Mehrere Strings ersetzen schlägt fehl
 
Man könnte auch die Zeichenklasse erweitern wenn das ? nicht enthalten ist:
Code:
$line= preg_replace("/\[url=([._\-\?\+#]*)\]/Usi", "<a href=\"\\2\">", $line);
Was der . schon alles abdeckt habe ich leider grad nicht im Kopf, aber so ungefähr sollte es gehen ;)

rollstuhlfahrer 7. Nov 2010 15:28

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: http://www.christian-seiler.de/projekte/php/bbcode/.

Matze 7. Nov 2010 15:34

AW: [php] Mehrere Strings ersetzen schlägt fehl
 
Na, wenn's darum geht. Ich nutze NBBC. Das kann man wunderbar erweitern und ich bin mit der Klasse sehr zufrieden.
Beispiele zur Verwendung gibt's hier. Da könntest du dir einen Überblick verschaffen, falls es dich intreressiert.

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 06:26 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz