Hallo,

Ik ben bezig een website beheer paneel te maken in PHP.
Ik kan inmiddels al een bestand openen en lezen met PHP.
Nu wil ik dat het opgehaalde bestand wordt gefilterd op een bepaalde waarde.
Bijv. een apache2 config file filteren op "<VirtualHost *:80>" en "</VirtualHost>".
En alles wat zich tussen deze waarden zit wordt weergegeven.
Dus dat er uiteindelijk iets als voorbeeld onderstaand wordt weergegeven:

<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot /var/www
</VirtualHost>

Hoe kan ik dit doen?

Wat ik nu heb is:

<?PHP
$file = fopen("/etc/apache2/sites-available/000-default.conf","r");
echo fread($file, filesize("/etc/apache2/sites-available/000-default.conf"));
fclose($file);
?>
met de strpos functie: http://php.net/strpos

[size=xsmall]Toevoeging op 13/03/2015 14:12:12:[/size]

<?PHP
$file = fopen("/etc/apache2/sites-available/000-default.conf","r");
$str = fread($file, filesize("/etc/apache2/sites-available/000-default.conf"));
fclose($file);

echo '<VirtualHost gevonden op positie ' . strpos($str, '<VirtualHost', 0);
?>
Hoi,

Het werkt een soort van.
Dit is echter niet wat ik zoek als ik gebruik wat u gepost heeft krijg ik een int terug met de waarde 1266.
Ik zou graag in plaats van dat getal de tekst die tussen de waarden staat te zien krijgen.

Groet
je wilt de vhosts gaan editen?

Mag ik je dan aanraden om de vhosts in elk een aparte file te opslaan?
Je kunt in httpd.conf aangeven in welke dir Apache de vhost files kan vinden.

Als je alles in 1 file hebt staan, dan is er altijd de kans dat bij een mislukte edit ineens alles kwijt is.
Dat is een stuk vervelender dan als er 1 file kapot is.

Sowieso zou ik heel zeker proberen te zijn van wat er geëdit wordt. Als ik als eigenaar van abc.com mijn settins zo mag aanpassen, dan staat daarbij ook ServerAlias.
Wordt dan geblokkeerd dat xyz.nl daar ingevuld kan worden? Dat opent mogelijkheden om domainen te kapen....

[size=xsmall]Toevoeging op 13/03/2015 14:34:05:[/size]

betreffende regel in mijn httpd.conf files:


# Virtual hosts
Include conf/extra/httpd-vhosts.conf
Include /etc/vhosts/*


mijn vhost definities staan dus allemaal in files als /etc/vhosts/abc.com
(al doet de naam er in principe niet toe)
Met strpos bepaal je de positie en dan kun je met substr() de tekst in stukken knippen.
De bedoeling is niet dat dit uiteindelijk op een daatwerkelijk webserver komt te draaien.
Dit is alleen voor een locale webserver voor sommige mensen binnen de opleiding.

[size=xsmall]Toevoeging op 13/03/2015 14:39:47:[/size]

Frank,

Ik begrijp niet helemaal wat je bedoeld.
Kun je iets duidelijker zijn of met een voorbeeld komen?
stap 1 is de de functie strpos() http://php.net/strpos

gebruik die om te bepalen waar de eerste keer <VirtualHost staat in de tekst.

Kijk dan nog een keer in manual om te bepalen hoe je vanaf dat punt verder zoekt naar de de string "</VirtualHost>"

Je hebt dan 2 posities te pakken.
Je bepaalt de lengte van je blok door beide waarden van elkaar af te trekken.

Nu komt http://php.net/substr aan de beurt.
Deze functie kun je gebruiken om vanaf de eerst gevonden positie een stuk tekst te pakken met een zekere lengte....

Lukt dat
dan is de volgende stap om dat in een lus te doen voor alle vhosts
Probeer maar:

<?php
function findBlock($str, $startingWith, $endingWith)
{
$start = strpos($str, $startingWith);

if($start === FALSE)
return FALSE;

$stop = strpos($str, $endingWith, $start);

if($stop === FALSE)
return substr($str, $start);

$stop += strlen($endingWith);

return substr($str, $start, $stop - $start);
}

$str = "bla-die-bla<VirtualHost *.80>\nbla-die-bla\n</VirtualHost>nog meer bla-die-bla";


echo htmlentities(findBlock($str, '<Virtual', '</VirtualHost>'));

?>

Reageren