Regelnummers voor php script

Status
Niet open voor verdere reacties.

RonaldGJ

Gebruiker
Lid geworden
28 apr 2007
Berichten
419
Hallo,
al weer een poosje geleden dat ik wat gepost heb, maar ik zit nu toch weer met iets waar ik zelf niet echt uit kom en op internet niet goede voorbeelden kan vinden.
Ik wil dat als je een php scriptje schrijft tussen de php tags. Dat dat stuk gehighlight wordt + dat er regelnummers voor komen te staan.

Nu heb ik al dat stukken tussen de php tags worden vervangen voor highlight_string(' string ').
Nu is mijn vraag alleen, hoe krijg ik het aantal regels van <?php tot ?>, zodat ik dat er voor kan zetten.
Dus een beetje hetzelfde krijgen als hier, maar dan met regelnummers:
PHP:
<?php
        function som($getal1, $getal2){
                $som = $getal1 + $getal2;
        }
?>

Iemand een idee hoe dat te doen?

Alvast hartelijke dank,

Gr. Ronald!:)
 
Je zou de string kunnen splitten op een <br /> tag. Dan krijg je een array met alle regels.

Om het weer te geven zou je dan een for-loop kunnen gebruiken.

Voorbeeld:

PHP:
<?php
/*
Je code staat in een variabele:

$code = '
          <?php<br/>
              function som($getal1, $getal2){<br />
                  $som = $getal1 + $getal2;<br />
              }<br />
          ?>';
*/

$php = explode('<br />', $code);
$n = count($php);

for($i = 1; $i <= $n; $i++){
    $j = $i - 1;
    echo $i, ' ', $php[$j];
}
?>

Als je nog newline-characters hebt in plaats van '<br />''s gebruik je:

PHP:
$php = explode('\n', $code);
 
Hij werkte niet helemaal lekker, alles stond achter elkaar ipv onder elkaar. Ik heb na de $php[$j] daarom een <br /> toegevoegd, waardoor hij het wel deed, maar niet volgens mijn idee. De tag <?php van $code gaf hij niet meer. Ik heb van de < een &lt; gemaakt, maar ook dan geeft hij de tweede regel zonder regelnummer!

Ik zal je laten zien wat ik al had:
Code:
<?php
$bericht = "
Welkom op mijn eerste tutorial. Ik ga hier uitleggen hoe je zelf een functie kunt maken:
[php]
<?php
function som(\$getal1, \$getal2){
	\$som = \$getal1 + \$getal2;
	return \$som;
}
?>
[/php]
<br />
Doe je dan bijvoorbeeld dit:
[php]
<?php
echo som(1,7);
// Dit zal 8 weergeven
?>
[/php]
<br />
Dan kun je zelfs dit nog doen:
[php]
<html>
	<head>
		<title>Test - jaja</title>
	</head>
<body>
Testjeeeeeeee!
</body>
</html>
[/php]
";


$bericht = preg_replace('/\[php\](.*?)\[\/php\]/ise', "highlight_string(' \\1 ', TRUE)", $bericht);

echo $bericht;
?>

Hij geeft de highlight goed weer, je kunt het zo kopieeren en plakken en dan werkt het! Ik wil dus nu dat het stuk dat gehighlight word met regel nummers wordt gepresenteerd. Ik heb al ergens gezien dat ze het met een table deden. De linker td de cijfers en de rechter td de code. Het scriptje van jou werkt dus opzich wel, maar helaas niet helemaal lekker:confused:.

Weet je misschien hoe het kan met table en dat de regels ook inspringen, want dat doen ze nu ook niet!

Vast bedankt!

Gr. Ronald!:)
 
Ik heb het volgende scriptje net getest en het werkt. Je kunt de inspringing behouden door <pre> te gebruiken (preformatted).

Dit is mijn code:

PHP:
<?php
/*
Je code staat in een variabele:
*/
$code = '
<?php<br />
	function som($getal1, $getal2){<br />
		$som = $getal1 + $getal2;<br />
	}<br />
?>';

         
$code = str_replace("\r\n", '', $code);
$php = explode('<br />', $code);
$n = count($php);
echo '<pre>';
for($i = 1; $i <= $n; $i++){
    $j = $i - 1;
    echo $i, ' ', htmlentities($php[$j]), '<br />';
}
echo '</pre>';
?>

Ik heb er nu geen syntaxhighlighting inzitten, want die werkt om een of andere reden niet op mijn PC.
 
Ik heb hem getest en hij werkt idd! Ik ben nu alleen nog aan het klooien hoe ik die highlight er in krijg, want het wil niet erg lukken. Die highlight functie schrijft zelf de <br /> erbij, dus die kan ik uit $code weghalen.

Weet jij hoe ik die highlight er wel in kan krijgen dan, ondanks dat het bij jou niet werkt!

Bedankt,

Gr. Ronald!:)
 
Oké, het is me toch gelukt! :D

PHP:
<?php
$output = highlight_string(
'<?php
	echo "Dit is een string!" // Commentaar

	function som($getal1, $getal2){
		return $getal1 + $getal2;
	}
?>', true);

$output = explode("<br />", $output);
$n = count($output);

for($i = 1; $i <= $n; $i++){
	echo '<code style="color: #000">', $i, '|</code> ', $output[$i - 1], '<br />';
}
?>

Laat je nog even weten of het bij jou ook werkt?

Ik zie nu dat ie bij een code van meer dan 10 regels 1 teken verspringt (bij 100, 2 tekens enz) ff denken wat ik daaraan kan doen!
 
Laatst bewerkt:
Fantastisch!! Echt geweldig!:thumb:
Nou is kijken of ik het kan integreren in mijn eigen script met de preg_replace()!

Ik weet niet of je wat weet van preg_replace(), maar weet jij hoe ik ook een <div> om de code kan krijgen?

Dus ik heb dit:
$bericht = preg_replace('/\[php\](.*?)\[\/php\]/ise', "highlight_string(' \\1 ', TRUE)", $bericht);

Hij vervangt nu [ php] alles hiertussen [ /php] voor highlight_string('alles hiertussen', TRUE).

Maar nu wil ik dat ie het vervangt voor <div class='code'> highlight_string('alles hiertussen', TRUE) </div>.

Weet jij dit?

En nogmaals bedankt voor het script!;)

Gr. Ronald!:)
 
Wat dacht je van na die preg_replace() dit te doen:
PHP:
$bericht = '<div class="code">'. $bericht .'</div>';
 
Kun je niet doen:

PHP:
$bericht = '<div class="code">' . preg_replace('/\[php\](.*?)\[\/php\]/ise', "highlight_string(' \\1 ', TRUE)", $bericht) . '</div>';

Was net te laat ;)
 
Wat dacht je van na die preg_replace() dit te doen:
PHP:
$bericht = '<div class="code">'. $bericht .'</div>';

Nou kijk, ik heb dus zeg maar nog meer tekst in 'uitleg' staan:

PHP:
Dit is een tutorial:
<?php
function som(\$getal1, \$getal2){
	\$som = \$getal1 + \$getal2;
	return \$som;
}
?>

Dus als ik die div eromheen zet, komt alles in die div te staan! Wat ik wil is de tekst gewoon en dan de code in een speciale div, zodat ik met css een border eromheen kan doen en wat meer opmaak!

Dus:

Dit is een tutorial:
<div>
<?php
function som($getal1, $getal2){
$som = $getal1 + $getal2;
return $som;
}
?>
</div>
 
Oke, de laatste versie:

PHP:
<?php
$output = highlight_string(
'<?php
    echo "Dit is een string!" // Commentaar

    function som($getal1, $getal2){
        return $getal1 + $getal2;
    }
    
    print som(3, 8);
    
    /* Geeft: 11 */
?>', true);

$output = explode("<br />", $output);
$n = count($output);

for($i = 1; $i <= $n; $i++){
    echo '<code style="color: #000; white-space: pre">', str_pad($i, 3), '|</code> ', $output[$i - 1], '<br />';
}
?>

Deze zorgt ervoor dat voor een script tot 1000 regels de tekst netjes onder elkaar blijft staan. Als je een script langer dan 999 regels hebt, dan moet je sit stukje even aanpassen:

PHP:
str_pad($i, 3)

Dan maak je van die 3 een 4 (of 5 als je een echt enorm script hebt ;))
 
Oke ik heb nu het volgende script gemaakt:

PHP:
<?php
$bericht = "
Dit is een tutorial:
[ php]<?php
function som(\$getal1, \$getal2){
	\$som = \$getal1 + \$getal2;
	return \$som;
}
?>
[ /php]
";

preg_match('/\[ php\](.*?)\[ \/php\]/ise', $bericht, $script);
$output = highlight_string($script[1], true); 

$output = explode("<br />", $output); 
$n = count($output); 

for($i = 1; $i <= $n; $i++){ 
    echo '<code style="color: #000; white-space: pre">', str_pad($i, 3), '</code> ', $output[$i - 1], '<br />'; 
} 
?>

Maar nu neemt ie de enter na [ php] ook mee. Wat er gebeurd:
[ php]
<?php
echo "Blaat";
?>
[ /php]

Dan komt <?php op regel 2 te staan.

Doe je:
[ php]<?php
echo "Blaat";
?>
[ /php]

Dan komt <?php keurig op de eerste plek te staan. Die afsluiting van de [ /php] die zorgt er ook voor dat er nog een regel onder komt! Weet iemand hoe ik dit kan veranderen, zodat het niet uitmaakt of <?php acher de tag [ php] staat, of op een volgende regel?

Bedankt,

Gr. Ronald!:)
 
Je zou kunnen doen:

PHP:
while($output[0] == ''){
    array_splice($output, 0, 1);
}

Ik heb het niet getest, maar volgens mij moet dat wel werken.
 
Nee helaas, ik heb het er tussen gezet, maar het blijft zo dat als ik <?php op de regel onder de tag [ php] heb staan, dat dan de eerste regel leeg is.
Die eerste enters moeten weg en de laatste ook!

Ander ideetje?

Bedankt,

Gr. Ronald!:)

Edit:
Dit heb ik dus gedaan:

PHP:
preg_match('/\[php\](.*?)\[\/php\]/ise', $bericht, $script);
$output = highlight_string($script[1], true); 
$output = explode("<br />", $output);
while($output[0] == ' '){
    array_splice($output, 0, 1);
} 
$n = count($output);
 
Laatst bewerkt:
PHP:
preg_match('/\[php\](.*?)\[\/php\]/ise', $bericht, $script);

$output = highlight_string($script[1], true); 

$output = explode("<br />", $output);

while(empty($output[0])){

    array_splice($output, 0, 1);

} 

$n = count($output);

Zo misschien, dat zou de eerste lege regels weg moeten halen.

De laatste regels moet ik nog even over nadenken.
 
PHP:
preg_match('/\[php\](.*?)\[\/php\]/ise', $bericht, $script);

$output = highlight_string($script[1], true); 

$output = explode("<br />", $output);

while(empty($output[0])){

    array_splice($output, 0, 1);

} 

$temp = array_reverse($output);

while(empty($temp[0])){

    array_splice($temp, 0, 1);

}

$output = array_reverse($temp);

$n = count($output);

Wat het script nu doet is:

Het kijkt of de eerste waarde in de output-array leeg is, dan verwijderd ie de eerste waarde. Vervolgens gaat ie de while-loop nog eens af tot dat ie een waarde vind in de eerste term van de array.

Vervolgens draait ie de array om in een tijdelijk var ($temp) en dan herhaalt ie hetzelfde verhaaltje, maar nu dus eigenlijk van achteren.

Daarna zet ie de 'getrimde' array weer in de $output variabele en dan wordt die geoutput.
 
Laatst bewerkt:
Werkt ook niet :confused:
Er gaat ook niets fout ofzo, hij doet gewoon net als wat ie anders doet, elke witregel tussen [ php] en <?php zie je als lege regel bij het restultaat!

Gr. Ronald!:)
 
Ik heb het al, het werkt in ieder geval bij mij en het was zo eenvoudig... :o

PHP:
<?php
$output = highlight_string(trim(
'

<?php
    echo "Dit is een string!" // Commentaar

    function som($getal1, $getal2){
        return $getal1 + $getal2;
    }
    
    print som(3, 8);
    
    /* Geeft: 11 */
?>


'), true);

$output = explode("<br />", $output);

$n = count($output); 

for($i = 1; $i <= $n; $i++){
    echo '<code style="color: #000; white-space: pre">', str_pad($i, 3), '|</code> ', $output[$i - 1], '<br />';
}

Deze regel moet je aanpassen: $output = highlight_string(trim(

en dan moet hier: '), true); dus nog een haakje
 
Laatst bewerkt:
Nu volg ik je even niet meer:p
Hij geeft trouwens op de tweede lijn een error.

Parse error: syntax error, unexpected '[', expecting ')' in C:\...\test.php on line 2

Ook snap ik niet wat die en [color] daar precies doen en hoe dit de enters tussen [ php] en <?php weghalen.

Zou je het willen uitleggen?

Bedankt,

Gr. Ronald!:)
 
Nu volg ik je even niet meer:p
Hij geeft trouwens op de tweede lijn een error.

Parse error: syntax error, unexpected '[', expecting ')' in C:\...\test.php on line 2

Ook snap ik niet wat die en [color] daar precies doen en hoe dit de enters tussen [ php] en <?php weghalen.

Zou je het willen uitleggen?

Bedankt,

Gr. Ronald!:)


Die en [COLOR] waren foutjes, omdat ik kleuren probeerde aan te geven voor wat nadruk op de trim() functie.

Als je de code overneemt zoals die er nu staat werkt het wel.

De trim functie haalt alle white-space weg aan het begin en einde van een string (spaties, enters, tabs, vertical tabs etc.)

Daar door heb je uiteindelijk een keurige string over.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan