php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 04.12.2004, 17:15  
Gast
 
Beiträge: n/a
Standard Erkennung von Arrays in Strings

Sorry für den sehr wässrigen Betreff, aber mir ist keine bessere kurze Beschreibung des Themas eingefallen.
Also ich bastle momentan an einem sehr kleinen, auf meine Bedürfnisse zugeschnittenem Templatesystem. Hab das früher mit sehr unausgegorenen Funktionen mit Hilfe von eval() gemacht, diesmal soll es eine php5-klasse ohne eval sein. Und hier stoße ich beim parsen von Variablen innerhalb von Templates auf ein Problem, dass ich trotz halbwegs gutem Umgang mit den preg_* Funktionen nicht auf Anhieb lösen kann.
Mal angenommen, ich habe einen String mit folgendem Inhalt:
Code:
Dies ist eine $variable
Hier funktioniert das noch alles problemlos, folgende Zeile handelt das problemlos:
Code:
preg_replace_callback("/\\$\w+*/",array("self","parse_callback"),$this->template);
Ich nutze deswegen eine Callback-Funktion, weil diese die Variable vorher auf Existenz überprüft, um hässliche Fehler zu vermeiden. Problematisch wird es nun, wenn ich das ganze mit Arrays machen will, d.h. für z.B. $array1[element1] ... den Pattern, um den Array zu erkennen, hab ich bereits, und er funktioniert:
Code:
preg_replace_callback("/\\$\w+(\[\w+\])*/",array("self","parse_callback"),$this->template);
Nur kommt hier das Problem bei der Callback-Funktion. Diese "kapiert" nicht, dass mit den eckigen Klammern die Indizes eines Arrays gemeint sind. Ich hab das ganze bereits mit variablen Variablen (${$matches[0]}) probiert, keine Chance. Die Lösung wär natürlich eval(), aber wie gesagt, die Funktion wollte ich vermeiden. Gleich im Anhang die komplette Klasse - sie ist noch lange nicht fertig, aber der Rest sollte keine Probleme mehr bereiten.

Schön wäre, wenn das ganze noch rekursiv funktionieren würde, d.h. ich auch mehrdimensionale Arrays reinpacken kann.
Wenns hilft, stell ich gern die Templatestabelle oder ein paar Beispielzeilen rein.


Code:
error_reporting(E_ALL | E_STRICT);

final class template {
  
  private static $initialized = false;  
  private static $templates = array();
  private static $replacements = array();
  private static $con;
  private $template;

  function __construct($template) {
    if (!self::$initialized) $this->initialize();
    if (!isset(self::$templates[$template])) {
    	trigger_error("illegal template",E_USER_WARNING);
    	return false;
    } else {
    	$this->template = self::$templates[$template];
    }
  }
  
  private function initialize() {
  	self::$con = mysql_connect("localhost","root","");
  	mysql_select_db("template");
  	$res = mysql_query("SELECT name,code FROM templates");
  	while ($template = mysql_fetch_array($res)) self::$templates[$template["name"]] = $template["code"];
  }
  
  public function dump_templates() {
  	echo "<table style=\"background-color:#C0C0C0\">";
  	echo "<tr><td style=\"background-color:#FFFFFF;font-family:verdana;font-size:12px;color:#000000;font-weight:bold\">name</td><td style=\"background-color:#FFFFFF;font-family:verdana;font-size:12px;color:#000000;font-weight:bold\">code</td></tr>";
  	foreach (self::$templates as $name=>$code) {
  		echo "<tr><td style=\"background-color:#FFFFFF;font-family:courier new;font-size:11px;color:#000000\">{$name}</td><td style=\"background-color:#FFFFFF;font-family:courier new;font-size:11px;color:#000000\">" . nl2br(htmlspecialchars($code)) . "</td></tr>";
  	}
  	echo "</table>";
  }
  
  public function parse() {
    echo preg_replace_callback("/\\$\w+(\[\w+\])*/",array("self","parse_callback"),$this->template);
  }
  
  private static function parse_callback($matches) {
    if (!isset($GLOBALS[$matches[0]])) {
    	trigger_error("unset variable",E_USER_WARNING);
    	return "";
    } else {
    	return $GLOBALS[$matches[0]];
    }
  	
  }
  
}
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 04.12.2004, 17:28  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Damit wir nicht den ganzen Code verstehen müssen:
Wie sieht die Eingabe in preg_replace_callback() aus? ("blabla $varname['pos'] foo")?
Was kommt bei der callback-Funktion an (in $matches, vielleicht einen var_dump() posten)?
Was sollte ankommen?


Der Beitrag wurde verschoben, wegen...
... Postings im falschen Forum.

Bemerkung:
Die gestellte Frage entspricht nicht dem Wissensstand eines Profis. Dazu: http://www.phpfriend.de/forum/viewtopic.php?t=21431

Eine mittelschwere Frage zu regulären Ausdrücken ist bei den Fortgeschrittenen ganz gut aufgehoben.

moved to PHP - Fortgeschrittene
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 04.12.2004, 18:52  
Gast
 
Beiträge: n/a
Standard

Darauf hab ich gewartet Ich programmiere seit 4 Jahren kommerziell in PHP, möchte mich daher schon als Profi bezeichnen und der Beitrag wird verschoben. Die Frage hier betrifft primär nicht reguläre Ausdrücke, da sich das Problem damit alleine wohl nicht lösen lässt ...

Nun zum Problem: Ja die Eingabe in preg_replace_callback sieht in etwa so aus, nur ohne Hochkommas. In $matches[0] kommt in deinem Fall "$varname[pos]" an, in $matches[1] "[pos]". Das das ankommt ist genau richtig und so gewollt, das Problem betrifft (wenn du genau gelesen hättest, wüsstest du das auch) die callback-Funktion, die diese Variablen durch deren Wert ersetzen soll.
  Mit Zitat antworten
Alt 04.12.2004, 19:20  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Ich glaube nicht, dass es eine triviale Möglichkeit gibt, von Klammern in einem String auf ein Array zu kommen, man wird da wohl trennen müssen und den Namen des Arrays und den Schlüssel gesondert behandeln.
Also ungefähr so:
/\\$(\w+)(\[(\w+\)])*/ als Regex, um in $matches[1] nur den Variablennamen zu haben und in $matches[3] den Array-Schlüssel.
Wenn ein Array-Schlüssel gefunden wird, nimmt man dann statt
$GLOBALS[$matches[1]], was nur mit skalaren variablen funktioniert, das hier:
$GLOBALS[$matches[1]][$matches[3]]

PS: Soo kompliziert fand ich das nicht. Wenn Du nach der automagischen Funktion gesucht hast, die nur ein Profi gekannt hätte, fürchte ich, die gibts nicht.
PPS: Man muss sich nicht dafür schämen, hier im Fortgeschrittenen-Forum zu landen. Geld zu verdienen ist nur die formale definition von "Profi".
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 04.12.2004, 21:10  
Gast
 
Beiträge: n/a
Standard

... noch eine Beleidigung hinterher. Waq du hast einen Freund für dein Leben.
  Mit Zitat antworten
Alt 04.12.2004, 21:38  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von Fettmops
... noch ein Beleidigung hinterher. Waq du hast einen Freund für dein Leben.
Manche Leute schaffen es halt, überall Beleidigungen zu sehen.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 04.12.2004, 21:43  
Gast
 
Beiträge: n/a
Standard

Zitat:
PPS: Man muss sich nicht dafür schämen, hier im Fortgeschrittenen-Forum zu landen. Geld zu verdienen ist nur die formale definition von "Profi".
ja so bin ich, aber bei diesem Satz musste ich mich nicht sonderich anstrengen.
  Mit Zitat antworten
Alt 04.12.2004, 22:03  
Gast
 
Beiträge: n/a
Standard

eins wundert mich:

du codest zwar php5, machst aber so anfägersachen wie echo in einer classe....
wo hast du coden gelernt?
  Mit Zitat antworten
Alt 04.12.2004, 22:14  
Waq
Erfahrener Benutzer
 
Registriert seit: 15.08.2004
Beiträge: 2.473
Waq
Standard

Zitat:
Zitat von Fettmops
ja so bin ich, aber bei diesem Satz musste ich mich nicht sonderich anstrengen.
Dann hast Du halt Talent dafür.
__________________
mod = master of disaster
Waq ist offline   Mit Zitat antworten
Alt 05.12.2004, 00:31  
Gast
 
Beiträge: n/a
Standard

Zitat:
Nur kommt hier das Problem bei der Callback-Funktion. Diese "kapiert" nicht, dass mit den eckigen Klammern die Indizes eines Arrays gemeint sind.
Könntest Du Deinen Wunschzettel nicht auf das beschränken, was PHP "kapiert"?
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Mehrere Arrays summieren buggybugga PHP-Fortgeschrittene 8 22.07.2008 11:51
Mehrere Arrays unterschiedlicher Größe kombinieren querfisch PHP Tipps 2007 9 31.03.2007 21:34
Mehrere Mehrdimensionale Arrays Stefano PHP Tipps 2006 5 12.10.2006 13:18
Arrays sortieren, Bezeichnung, Preis Ticos PHP Tipps 2006 4 07.09.2006 19:37
Arrays kreuzen PHP Tipps 2006 13 08.03.2006 11:36
[Erledigt] 2 Arrays miteinander vergleichen PHP Tipps 2007 3 17.12.2005 16:54
Objektorientierter Zugriff auf Multidimensionale Arrays PHP-Fortgeschrittene 31 26.11.2005 21:46
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
doppelte Werte / Strings einer Spalte nur einmal ausgeben... Datenbanken 2 29.07.2005 12:10
zweidimensionale Arrays für Templates aufbereiten? PHP Tipps 2005 6 22.03.2005 20:49
alle Positionen eines Strings innerhalb eines Strings finden PHP Tipps 2005 8 23.02.2005 20:21
mime type erkennung bei upload? PHP Tipps 2004 3 03.11.2004 14:34
[Erledigt] Strings saeubern PHP Tipps 2004 2 12.10.2004 15:52
2 arrays in abhängigkeit ??? PHP Tipps 2004 2 11.08.2004 21:19
Werte eines Arrays in eine MySQL schreiben PHP Tipps 2004 2 28.06.2004 13:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
erkennung in strings, php arrays in template sammeln, string mit eckigen klammern zu array php, php eval array string, http://www.php.de/php-fortgeschrittene/13517-erledigt-erkennung-von-arrays-strings.html, php string kommt im array vor, arrays und strings, php eval multidimensional array from string, php array key position finden und zwei zuvor ausgeben, php funktion array eckige klammern

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:02 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.