| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

16-06-2010, 20:18
|
|
icecoldkilla
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 5
|
|
kann mir jemand bitte preg_replace anhand des praktischen Beispiels erklären?
Hallo,
Ich würde gerne etwas mehr über preg_replace() methoden erfahren.
folgendes Problem :
ich habe :
$x = "a";
$y = "b";
$text = "Buchstabe nummer eins ist [[x]] und buchstabe nummer 2 ist [[y]]";
jetzt will ich das [[x]] durch $x und [[y]] durch $y ersetzt wird.
das löse ich folgendermaßen:
PHP-Code:
$values= array('[[x]]' => $x, '[[y]]' => $y); foreach ($values as $i => $j) { $text = str_replace($i, $j, $text); }
jetzt will ich aber, wenn ich jetzt z.B. noch $z = "c"; einfüge und in $text noch [[c]] vorkommt, das es automatisch ersetzt wird ohne das ich mein array erweitern muss.
folglich müsste ich [[*]] durch $* ersetzen, wobei * sowohl bei [[]] als auch bei $ der gleiche wert sein muss.
ich weiss, das es mit preg_replace gelöst werden kann, jedoch verstehe ich die komplizierte erklärung aus der PHP Doku leider nicht.
Kann mir jemand bitte helfen?
danke im Voraus, und tolles forum btw
|

16-06-2010, 20:24
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo und willkommen im Forum,
erklär mir mal bitte erstmal, warum dir die vielen Beispiele im Handbuch nicht reichen.
Was die komplizierten Erklärungen angeht: PCRE ist ein komplexes Thema und da mussten wir alle mal durch. Aber sei versichert, dass sich die 2 Tage lohnen, in denen du damit rumprobieren solltest.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (16-06-2010 um 20:28 Uhr)
|

16-06-2010, 20:28
|
|
icecoldkilla
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 5
|
|
Hallo,
Weil nirgendwo nach variablem Inhalt gesucht wird, bzw unbekannter Inhalt der zwischen 2 bestimmten Zeichen / Zeichenketten steht.
dankeschön
|

16-06-2010, 20:32
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
PHP: Square brackets - Manual
Die ersten 7 Absätze solltest du lesen und deine Versuche und Teilerfolge hier dokumentieren. Wenn du dann nicht weiter kommst, sehen wir weiter. Aber ich will jetzt erstmal Eigeninitiative sehen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

16-06-2010, 22:01
|
|
icecoldkilla
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 5
|
|
Hallo,
Vielen Dank schonmal
na dann werd ich hier nach und nach editieren.
also der Ausdruck nach dem ich suche ist wohl
PHP-Code:
"/[[+([a-zA-Z]{2,})+]]/"
jetzt muss ich nur noch den variablen Inhalt zwischen [[ und ]] herausfiltern.
Leider habe ich hier keine Ahnung wie ich das tun soll.
Ausserdem habe ich auch keine Ahnung ob der Ausdruck richtig ist, da mir der zweite Teil fehlt um es herauszufinden.
EDIT :// zum debuggen hab ich das jetzt erstmal so versucht, aber er ersetzt nicht, ausserdem habe ich einen Fehler oben entdeckt :
PHP-Code:
$x = "a"; $y = "b"; $z = "c";
$text = "@x@ @y@ @z@";
$text = preg_replace("/^@$([a-zA-Z]{2,})^@$/i", "it worked", $text);
echo($text);
edit 2 ://
so klappts :
PHP-Code:
$x = "a"; $y = "b"; $z = "c";
$text = "@x@ @y@ @z@";
$text = preg_replace("/@(\w+)@/", "it worked", $text);
echo($text); // Ausgabe dem entsprechend it worked it worked it worked
ich muss nur noch rausfinden wie ich dieses (\w+) auslesen kann...
noch ein Edit ://
das ich mit $1 arbeiten muss ist mir nun auch klar, bloß kann ich aus $1 keine variable variable machen ($$1).
hier scheiter ich nun, weiter komm ich nicht.
Geändert von icecoldkilla (16-06-2010 um 22:20 Uhr)
|

16-06-2010, 22:20
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Das $ vorn muss weg, das verankert den Ausdruck am Ende und macht daher am Anfang keinen Sinn.
Die Ersetzung mit @ ist bestimmt eine Krücke, weil du nicht wusstest, dass [ und ] Sonderzeichen sind, welche du maskieren musst: \[ und \].
Edit: Gespeicherte Subpatterns kann man auch mit \\ statt $ abrufen, was ich auch empfehle:
PHP-Code:
echo preg_replace("/f(o+)bar/", "schm\\1bar", "fooooooobar"); // => schmooooooobar
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (16-06-2010 um 22:28 Uhr)
|

16-06-2010, 22:25
|
|
icecoldkilla
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 5
|
|
Hallo,
Ja das @ war nur eine Krücke, dankeschön
und ich bin jetzt etwas weiter gekommen, kannst du mir vielleicht sagen wo nun mein Fehler ist ?
hatte es schon oben dokumentiert
bzw :
jetzt bin ich bei
PHP-Code:
<?php
$x = "a"; $y = "b"; $z = "c";
$text = "[x] [y] [z]";
$text = preg_replace("/\[(\w+)\]/", "works", $text);
echo($text);
ich weiss auch das ich mit $1 das (\w+) rausfiltern kann,
jedoch kann ich mit $$1 keine variable variable aus $1 machen die dann beispielsweise auf $x zugreifen würde, sondern es wird $x ausgegeben als Text.
|

16-06-2010, 22:32
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von icecoldkilla
jedoch kann ich mit $$1 keine variable variable aus $1 machen die dann beispielsweise auf $x zugreifen würde, sondern es wird $x ausgegeben als Text.
|
Da solltest du mal bei preg_replace_callback nachsehen, obwohl ich das ganze Vorhaben für bedenklich halte. Das was du machen willst sieht nach einer unsauberen Behebung eines Designfehlers aus. Es gibt auch noch einen e- Modifier, der den Ersetzungsausdruck als PHP-Code evaluiert, aber das ist auch dirrrty, wenn du mich fragst.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
Geändert von AmicaNoctis (16-06-2010 um 22:35 Uhr)
|

16-06-2010, 22:43
|
|
icecoldkilla
Registrierter Benutzer
|
|
Registriert seit: Jun 2010
Beiträge: 5
|
|
Hi,
Dankeschön
PHP-Code:
$x = "a"; $y = "b"; $z = "c";
$text = "[x] [y] [z]";
$text = preg_replace("/\[(\w+)\]/e", "$$1", $text);
echo($text);
Ausgabe : a b c
|

16-06-2010, 23:18
|
 |
fireweasel
Registrierter Benutzer
|
|
Registriert seit: Sep 2008
Ort: At home
Beiträge: 680
|
|
edit:
Hoppala, ich war doch nur zwei Stunden weg. Das nächste Mal mach ich erst einen Reload, bevor ich 'nen Post abschicke ...
Zitat:
Zitat von icecoldkilla
Hallo,
Ich würde gerne etwas mehr über preg_replace() methoden erfahren.
folgendes Problem :
ich habe :
$x = "a";
$y = "b";
$text = "Buchstabe nummer eins ist [[x]] und buchstabe nummer 2 ist [[y]]";
jetzt will ich das [[x]] durch $x und [[y]] durch $y ersetzt wird.
PHP-Code:
$values= array('[[x]]' => $x, '[[y]]' => $y);
foreach ($values as $i => $j) {
$text = str_replace($i, $j, $text);
}
jetzt will ich aber, wenn ich jetzt z.B. noch $z = "c"; einfüge und in $text noch [[c]] vorkommt, das es automatisch ersetzt wird ohne das ich mein array erweitern muss.
folglich müsste ich [[*]] durch $* ersetzen, wobei * sowohl bei [[]] als auch bei $ der gleiche wert sein muss.
ich weiss, das es mit preg_replace gelöst werden kann, jedoch verstehe ich die komplizierte erklärung aus der PHP Doku leider nicht.
|
Ich würde sagen, ohne üble Hacks kann das Problem NICHT mit preg_replace() gelöst werden.
Erstens kennt preg_replace() die Namen von Variablen nicht.
Zweitens scheitert eine allgemeine Mustersuche daran, dass nicht bekannt ist, welche dieser einbuchstabigen Variablen gerade im Script deklariert sind. Man könnte zwar etwas mit preg_replace_callback() oder preg_replace() und dem Modifikator "/e" stricken, aber das würde auf eine Art Hack hinauslaufen.
Die (halbwegs) saubere Variante ist die Erweiterung des Arrays:
PHP-Code:
$replace_me = array (
'x' => $x,
'y' => $y,
'c' => $z,
);
$new_text = preg_replace(
'/\[\[([a-z])\]\]/e',
'isset($replace_me["$1"]) ? $replace_me["$1"] : $0;',
$old_text
);
Halbwegs sauber deshalb, weil "/e" eine versteckte Form von eval() ist. Eine Lösung mit preg_replace_callback() wäre die sicherere Variante.
Okay, dann weiter an der richtigen Stelle:
Zitat:
Zitat von icecoldkilla
Hi,
Dankeschön
PHP-Code:
$x = "a";
$y = "b";
$z = "c";
$text = "[x] [y] [z]";
$text = preg_replace("/\[(\w+)\]/e", "$$1", $text);
echo($text);
Ausgabe : a b c 
|
Und was glaubst du, passiert, wenn deine Variablen anders definiert wurden? Beispielsweise so:
PHP-Code:
// $x fehlt ganz ...
$y = "b";
$z = "boeser php-quellcode, der unanstaendige Sachen macht;";
"/e" ist gefährlich, wenn man keine Ahnung hat.
Und variable Variablen sollte man meiden.
__________________
PHP-Code:
class Brick implements Throwable {
// ...
}
Geändert von fireweasel (16-06-2010 um 23:31 Uhr)
|

16-06-2010, 23:29
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von fireweasel
Das nächste Mal mach ich erst einen Reload, bevor ich 'nen Post abschicke ... 
|
Trotzdem schön zu wissen, dass jemand in allen Punkten mit mir übereinstimmt.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|