fout met heredoc syntax

Status
Niet open voor verdere reacties.

ecross

Gebruiker
Lid geworden
4 mrt 2009
Berichten
638
hallo allemaal,
ik heb een stuk php dat ik op mijn pagina wil tonen dus ik heb dit gedaan: (sorry als de code te lang is :)
PHP:
<?php 

$code = <<<STRING
// instellingen verander deze
$debug = false;
$bug_email = 'ecross@live.nl';
// onherstelbare fouten opvangen
global $websitePrinted;
// de functie shutDown wordt uigevoerd wanner php stopt met parsen
register_shutdown_function('shutDown');
// de website is nog niet geprint
$websitePrinted = false;

// buffer start
ob_start();

// pagina includen welke een fatale error veroorzaakt verander hier de pagina
include('fatal_error.php');

// buffer legen
ob_end_flush();

// website is bij deze geprint
$websitePrinted = true;

/**
 * Deze functie wordt aangeroepen zodra php stopt met parsen.
 * Na het printen van de pagina wordt de globale variabele
 * $websitePrinted op true gezet. Mocht deze false zijn
 * dan is er een fatal error opgetreden
 */
function shutDown() {
    // variabele $websitePrinted globaal maken
    global $websitePrinted;
	global $debug;
	global $bug_email;
    // indien de website niet geprint is, en dus een fatal error heeft veroorzaakt
    if (!$websitePrinted) {
        // buffer legen om de foutmelding te onderdrukken
        @ob_clean();
		// laatste foutmelding ophalen
		$error = error_get_last();
		// error types ingeven
		$error_types = array('1'=>'fatal error','2'=>'warning','4'=>'parse error', '8'=>'notice', '16'=>'fatal core error', '32'=>'core warning', '64'=>'compile fatal error', '128'=>'compile warning', '256'=>'user triggerd fatal error','512'=>'user triggerd warning');
		// check welk error type het is
		if(array_key_exists($error['type'], $error_types)){$error_type=$error_types[$error['type']];}
		else{$error_type=$error['type'];}
		// error opmaken
		$error_markup='<font style="color:red"> ERROR <b>TYPE</b>: '.$error_type.
					  ' <b>MESSAGE</b>: '.$error['message'].' <b>LINE</b>: '.$error['line'].
					  ' <b>FILE</b>: '.$error['file'].
					  '</font>';
		// als in debug mode toon error
		if ($debug == true){echo $error_markup;}
		else { //anders een mailtje sturen en standaard foutmelding tonen
		$headers = 'From: '.$_SERVER['HTTP_HOST'] . "\r\n";
		mail($bug_email, 'fatal error ontstaan', 'laatste foutmelding : '.print_r($error, true), $headers);
        echo 'sorry bezoeker, er is iets ernstig mis gegaan';
		}
		
    }
}

?> 
STRING;
$code = htmlentities($code);
echo '<pre>'.$code.'</pre>';
en nu krijg ik de volgende error
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in ****/fatal_error_handler2.php on line 59
(dat is op lijn 46 in het script hier boven)
nu weet ik dat de heredoc syntax nogal gevoelig is en vaak verkeerde fout regels aangeeft (toch?) maar ik heb het ook geprobeerd met een "
(zo iets:)
$code = "
//code
";
en dan ligte regel 58 en 59 (46 en 47 in het script hier boven) anders op terwijl dat niet zou moeten. en ik kreeg ook de zelfde fout.

heeft iemand een idee waaraan dit licht?
 
ik heb het script maar in een appart bestandje gezet.
alleen de highlight_file() zet normale spatie's om in hard spaces (&nbsp;) waardoor hij niet 'door springt' naar de volgende regel aan het einde van de div.
ik het met zo willen oplossen maar het werkt niet:
PHP:
<div style='border: 2px solid black; width:80%; wrap:logical; white-space:normal;'>
<?php 
$code = highlight_file('fatal_error_script.php');
preg_replace('/&nbsp;/', ' ',$code);
echo $code;
?>
</div>

hoe moet het dan wel?
 
Als je highlight_file als string wilt hebben moet je de tweede parameter op true zetten, dus
PHP:
$code = highlight_file('fatal_error_script.php', true);
Het wissen van spaties kun je wel doen, maar dan ben je ook de complete uitlijning kwijt. Mocht je het toch willen doen, dan moet je nog eens naar je vervanging moeten kijken, want de & moet je escapen bij gebruik van regular exressions; bovendien kun je in dit geval beter str_replace gebruiken. Dus
PHP:
$code = str_replace('&nbsp;', ' ',$code);
of
PHP:
$code = preg_replace('/\&nbsp;/', ' ',$code);
 
is er ook een manier dat de tekst wel afbreekt aan het eind van de div,
maar de spatie's aan het begin van de regel wel worden getoond?

(eigenlijk moet het wel kunnen, hier op het forum kan het ook :D)
 
Ik denk dat ik je probleem niet begrijp, want als ik voor en na die div wat tekst zet, komt de code er netjes tussen
PHP:
<div>
	hoi
	<div style='border: 2px solid black; width:80%; wrap:logical; white-space:normal;'>
		<?php 
			$code = highlight_file(__FILE__, true);
			//$code = str_replace('&nbsp;', ' ',$code);
			//$code = preg_replace('/\&nbsp;/', ' ',$code);
			echo $code;
		?>
	</div>
	hey
</div>
 
Ah, nu snap ik het probleem. Als je bij de style van de div
Code:
overflow:auto
zet krijgt de div scrollbars wanneer de content niet past.
 
bedankt,
als iemand nog een oplossing weet zonder scrollbalk graag reactie
 
ik heb het gevonden:

gewoon white-space:pre-wrap; als style aan de div toevoegen.

nog bedankt voor de reachtie's
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan