PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] String suchen und ersetzen


Schneemann
04.01.2009, 02:05
Hallo,

ich möchte einen String in einem Text ändern.

Der zu suchende Ausdruck kann heißen funktion(), aber auch funktion(value="abc") oder funktion(inhalt mit klammern ) und/oder sonderzeichen).

Wie muss so ein Ausdruck heißen der das findet?


P3000
04.01.2009, 02:06
Du suchst dies:

http://de3.php.net/manual/de/function.str-replace.php

DJFelipe
04.01.2009, 04:40
$string = "foo";
$string = str_replace("foo","bar",$string);

macht aus "foo" ein "bar".. denke das ist das was du suchst.. Da brauchst du nicht direkt mit regex arbeiten...:rolleyes:

kill4h`
04.01.2009, 12:36
Da sich der Inhalt der Klammern ändern kann ist hier ein regulärer Ausdruck mit Sicherheit angebrachter, als str_replace().

Die Funktion, die du brauchst: preg_replace()
Beschreibung findest du im PHP Manual.

Um einen gewissen Teil zu ersetzen:
preg_replace("#funktion([^)]*)#", "", $str);Kurze Erklärung:

preg_replace() sucht nach einem Teilstring in $str, der zunächst die Zeichen 'funktion(' enthält. Anschließend können beliebig viele Zeichen außer ')' folgen (auch gar keines!) und dann ')'. Dies wird durch den 2. Parameter ersetzt, in dem obigen Fall also durch gar nichts :)

Schneemann
04.01.2009, 12:43
Da sich der Inhalt der Klammern ändern kann ist hier ein regulärer Ausdruck mit Sicherheit angebrachter, als str_replace().

Die Funktion, die du brauchst: preg_replace()
Beschreibung findest du im PHP Manual.

Um einen gewissen Teil zu ersetzen:
preg_replace("#funktion([^)]*)#", "", $str);Kurze Erklärung:

preg_replace() sucht nach einem Teilstring in $str, der zunächst die Zeichen 'funktion(' enthält. Anschließend können beliebig viele Zeichen außer ')' folgen (auch gar keines!) und dann ')'. Dies wird durch den 2. Parameter ersetzt, in dem obigen Fall also durch gar nichts :)

In den Klammern der Funktion sollen aber auch noch Klammern () zulässig sein, sowohl paarweise als auch einzeln. Allerdings sind diese dann immer zwingend in einfachen oder doppelten Anführungszeichen zu finden.

funktion(inhalt1="abc" inhalt2=")" inhalt3="<html><body>...Code")

Wie geht das?

eViL_oNe
05.01.2009, 02:55
falls es hier darum geht, HTML oder gar Javascript mit Hilfe von Regexp zu parsen, so ist dieses Vorhaben zum Scheitern verurteilt.

Vgl auch http://www.coding-board.de/board/showthread.php?t=27631

Schneemann
05.01.2009, 14:35
Hier im Forum klappt das doch aber scheinbar wenn man das sieht:
funktion(inhalt1="abc" inhalt2=")" inhalt3="<html><body>...Code")

Da erkennt es korrekt was wohingehört und hebt es farbig sogar hervor. Das ist doch vergleichbar mit dem was ich vorhabe?

kill4h`
05.01.2009, 16:07
evil's Aussage hat einen anderen Hintergrund (sollte dir auffallen, wenn du den von ihm geposteten Thread durchliest):

Mit regulären Ausdrücken HTML o.Ä. zu parsen ist einfach sinnlos. Für solche Aufgaben gibt es das DOM, auch in PHP über libxml verfügbar.

Um also weitere Verwirrung zu vermeiden, solltest du dein Vorhaben nochmal detailliert erläutern, also was ist dein Input, was willst du matchen und wodurch ersetzen.

Schneemann
05.01.2009, 18:00
Hier das genaue Vorhaben.

Ich habe eine Administrationsoberfläche für Templates. Diese sind wie mit include() miteinander verbunden, jedoch über eine eigene Funktion mit dem Name embed(). Der Template-Quellcode wird ausgegeben und lesbar dargestellt.

Die Funktion embed() enthält notwendige und optionale Parameter. Ein notwendiger Parameter ist "template":
embed(template="dateiname")

Ein optionaler Parameter ist z.B. "query" für eine Abfrage, "skip" für einen zu überspringenden Wert, etc.:
embed(template="dateiname" query="db_abfrage" skip="10")

Die Syntax ist immer gleich, dem Attribut folgt ein Gleichzeichen, öffnende und schliessende Klammern.

Damit man leicht in der Administrationsoberfläche arbeiten und zwischen den Templates hin- und herspringen kann soll nun die funktion im Code verlinkt werden auf das template, dieses hat einen eindeutigen Namen und ist im template-Parameter in der Funktion zu finden.
embed(template="dateiname" query="db_abfrage" skip="10")

D.h. ist müsste zum einen den Wert in "template" auslesen (hier: "dateiname"), danach die ID des Templates "dateiname" in der DB suchen und dann die gesamte Funktion verlinken.
<a href="/link.php?template_id=21">
embed(template="dateiname" query="db_abfrage" skip="10")
</a>

eViL_oNe
08.01.2009, 17:12
da du hier offensichtlich einen eigenen Template-Parser schreibst, solltest du ihn entsprechend auch nach wie einen Parser gestalten. Reguläre Ausdrücke können so etwas wie du beschreibst im Allgemeinen NICHT bewerkstelligen. Spätestens wenn du den Parser erweiterst kriegst du damit Probleme.

Ein bewährter Weg, so etwas zu verarbeiten besteht darin, lexikalische und syntaktische Analyse voneinander zu trennen (in Form eines Tokenizers und Parsers) und darüber noch einen Interpreter zu bauen.

Noch einfacher wäre es natürlich, wenn man die Syntax von PHP für die eigenen Funktionen verwendet, etwa

<a href="/link.php?template_id=21">
<?= embed("dateiname", "db_abfrage", "10") ?>
</a>

embed wäre hier eine normale PHP-Funktion

Darüber hinaus gibt es ja diverse Template-Engines für PHP, die man verwenden könnte.

Schneemann
13.01.2009, 17:15
Noch einfacher wäre es natürlich, wenn man die Syntax von PHP für die eigenen Funktionen verwendet, etwa

<a href="/link.php?template_id=21">
<?= embed("dateiname", "db_abfrage", "10") ?>
</a>embed wäre hier eine normale PHP-Funktion
Dazu müsste aber immer jeder genau wissen wie viele Parameter die Funktion hat. Da dies optional ist und mal mehr, mal weniger sein können geht das so leider nicht.

Darüber hinaus gibt es ja diverse Template-Engines für PHP, die man verwenden könnte.
Ich kenne leider nur Smarty, kann allerdings nicht das was ich gerne machen möchte.