PHP zeichen ersetzen nach include

asseskiller

Lt. Junior Grade
Registriert
Sep. 2005
Beiträge
447
Hi

ich habe eine datei via PHP mit
PHP:
include('index.html');
geladen.
Ich möchte nun das beim interpretieren in der Seite
alle "{" mit einem "<?" ersetzt werden
und alle "}" mit einem "?>" ersetzt werden.
Weiß aber net wie ich das machen soll.

Damit ihr mich richtig versteht: Ich will die datei nicht verändern sondern, will nur das sie anders geladen wird.
 
Hi,

mach kein include(), sondern lies die Datei in einen String ein. Führe die Ersetzungen durch und lass den String mit eval() interpretieren.

MfG
 
Code:
$xyz = eval( '?>'.file_get_contents( 'index.html' ) );

das ersetzen musst du natürlich noch selbst regeln, die 2 funktionen sind aber alles was du brauchst.
 
hab jetzt eine index in nen string gelsen und zwar so:

PHP:
session_start();
include('functions.php');
$zeilen = file_get_contents("index.html");
$zeilenanzahl = count($zeilen);
$i=0;
while($zeilen<$zeilenanzahl)
{
	$zeilen[$i] = htmlspecialchars($zeilen[$i])."\n";
	$zeilen[$i] = str_replace("{","<?",$zeilen[$i]);
	$zeilen[$i] = str_replace("}","?>",$zeilen[$i]);
        echo $zeilen[$i];
	$i++;
}

erstmal habe ich das problem das der mir total komischen text aus:
zb:

&?php session_start(); include('functions.php'); ?& &!DOCTYPE HTML PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&& &html& &head& &meta http-equiv=&Content-Type& content=&text/html; charset=iso-8859-1&& &!-- STYLESHEET EINBINDUNG !--& &link href=&style.css& rel=&stylesheet& type=&text/css&& &!-- WEBSITE TITEL

wie ich das mit dem eval da einfügen soll weiß ich auch nicht weil ja nicht der ganze code pap ist.
 
Warum da nun die ganzen &-Zeichen stehen weiß ich nicht. Das ist vielleicht ein Zeichensatzproblem.

Ansonsten kannst du PHP und HTML in eval() mischen. Also guck, warum die spitzen Klammern nicht richtig erscheinen.

Edit: Lass das mit dem htmlspecialchars() mal weg...
 
htmlspecialchars bringt dir nix, da dort z.b. < zu &lgt; wird und das interpretiert ein browser als <, obwohl du ja ein tag anfangen willst. also raus damit, dann sollte es funktionieren.
 
damit hat es funktioniert:
PHP:
$xyz = eval( '?>'.file_get_contents( 'index.html' ) );

aber wofür ist dieses ?>
kannst du oder jemand anderes mir das bitte nochmal genau erklären weil bei php.net is nicht gerade hilfreich in diesem fall
 
asseskiller schrieb:
aber wofür ist dieses ?>

darüber bin ich auch das erste mal gefallen, aber kurz gesagt brauchst du es aus einem grund:

mit eval kannst du sachen auswerten, z.b. bastel ich mir grad ein kleines hilfsmittel, wodurch man funktionen und ableitungen er- und darstellen kann (x^2 und solches zeugs halt). eine zeile sieht da z.b. so aus um den wert auf einfache weise auszurechnen:

Code:
$this->data[(string)$c] = round( eval( 'return '.$fx.';' ), 10 );

das eval hier (mit return) wertet einen string aus in welchem z.b. 'pow(x,2)+5*x' steht. durch return bekommst du es zurückgegeben, du kannst aber auch variablen direkt zuweisen.

Code:
eval( '$test = \'blubb\' );

du siehst bis jetz also, dass du sachen auswerten kannst. das "besondere" dabei ist, dass der parser weiter läuft. wenn du nun html-code einbinden willst, welcher evtl. wiederum php-code enthält, musst du eval() mitteilen, dass der parser aufhören soll und ab nun reiner "text" kommt. im grunde ist es folgendes konstrukt:

Code:
<?php
  $test = 'blubb';
?> # <-- hier würdest du jetzt mit eval( '?>'.$xyz ); anfangen
<html>
<head>
<title>test</title>
</head>
<body>
test
</body>
</html>

ich hoffe es ist verständlich, mit einfachen erklärungen bin ich nicht immer so. ^^
 
hey leute noch ein kleines problem dazu:

ich hab in der index.php in die ich die index.html mit dem evalbefehl hineinlade
ein include("functions")
in dieser sind am anfang die datenbankszugangsdaten deklariert und dann die funktionen.

Das problem ist nun, das wenn ich beispielsweise meine funtion login() in der index.php aufrufe, alles einwandfrei.
Rufe ich sie jedoch in der index.html auf, führt er sie aus aber die datenbankserverzugangsdaten werden nicht übermittelt.:freak:

Aber der syntax wird richtig ausgeführt. es kommt nur immer dieses access denied for ....

muss das dringend wissen.

Wenn ich etwas komisch formuliert habe fragt bitte nach es ist echt wichtig.
 
asseskiller schrieb:
ich hab in der index.php in die ich die index.html mit dem evalbefehl hineinlade
ein include("functions")
in dieser sind am anfang die datenbankszugangsdaten deklariert und dann die funktionen.

bevor du weiter daran arbeitest, empfehle ich dir code, struktur und styles getrennt zu schreiben. also keinen misch-masch aus css und javascript in einer html und darin dann auch wieder php-code. irgendwann verlierst du den überblick und du weißt gar nicht mehr wo du anfangen sollst.

um das zu umgehen, nimmst du am besten eine template-engine. ich persönlich hab mit smarty sehr gute erfahrungen gemacht - es ist einfach, es besteht aus einer klasse und nicht aus mehreren funktionen, ist übersichtlich gemacht, caching ist vorhanden und ebenso eine gute dokumentation.

ist wie gesagt nur eine empfehlung, aber mach wie du es bisher gemacht hast/wie du es für besser hälst.



wie hast du denn die daten deklariert - konstanten, normale variablen? wenn es konstanten sind, sollte das problem nicht auftreten (define()), wenn du allerdings nur normale variablen genommen hast, versuch es mal mit dem global schlüsselwort, bevor du die datenbankverbindung aufbaust. sprich:

Code:
global $server;
global $user;
global $pass;
global $db;

mysql_connect( $server, $user, $pass );
mysql_select_db( $db );

die arbeit mit konstanten ist aber um einen wesentlichen teil einfacher.

und noch ein tipp am rande: anstatt include() zu verwenden, benutze lieber require_once() bei wichtigen dateien die eingebunden werden müssen.
 
klasse tipps.
Smarty will ich nicht nutzen mag keine fertigen sachen^^

Zu diesemrequire_once...
wozu ist das besser geeignet
 
asseskiller schrieb:
klasse tipps.
Smarty will ich nicht nutzen mag keine fertigen sachen^^

Zu diesemrequire_once...
wozu ist das besser geeignet

smarty ist nur die template engine. vielleicht mal ein beispiel daraus:

php:
Code:
<?php

  $template = new smarty();
  
  $template->assign( 'title', 'überschrift der seite oder ähnliches' );
  $template->assign( 'content', 'hier kommt jeglicher inhalt rein' );

  $template->assign( 'array', array( 'auch', 'arrays', 'gehen', 'problemlos' ) );
  
  $template->display( 'index.tpl' );

html:
Code:
<html>
<head>
<title>{$title}</title>
</head>
<body>
{$content}

<ul>
{foreach from=$array value=data}
  <li>{$data}</li>
{/foreach}
</ul>
</body>
</html>

{$*} sind jeweils die variablen die du über *->assign() zuweist. es gibt auch noch enorme vorteile im caching (die seite muss nicht komplett neu aufgebaut werden -> spart zeit und ressourcen). ich habs anfangs auch nicht gemocht, aber mittlerweile ist es um ein vielfaches einfacher. schleifen, bedingungen, ... sind dabei auch kein problem.



der unterschied von require() zu include() ist, dass require() mit einem error das script beendet, wenn die datei nicht existiert oder fehlerhaft ist. eigentlich von vorteil, da wenn ein script nicht vollständig ist oder die dateien nicht auffindbar, kann es logischerweise nicht korrekt angezeigt werden. ergo kommt ein error, anstatt einer seite wo gar nichts funktioniert.

das _once bei require_once() und include_once() ist dazu da, dass ein script nur 1 mal eingebunden wird. das ist speziell bei funktionen und klassen von vorteil, da wenn du funktionen mehrfach deklarierst, ebenso abgebrochen wird (da eine funktion/klasse ja nicht doppelt deklariert werden kann). durch das *_once() jeweils kannst du sicher sein, dass das jeweilige script nur 1 mal eingebunden wird, auch wenn du es mehrfach irgendwo einbindest (speziell in der modularen programmierung notwendig/von enormen vorteil).
 
Zurück
Oben