PHP filter maken om tekst bestand te filteren

Status
Niet open voor verdere reacties.

Atwist

Terugkerende gebruiker
Lid geworden
24 jan 2006
Berichten
1.076
Besturingssysteem
Wndows 11
Office versie
2016
Hallo,

Ik probeer een filter te maken die een log file uitleest, Nu ben ik niet zo handig met PHP maar heb het volgende in elkaar gezet in de hoop dat het werkte NEE dus.
Zou de jullie eens kunnen kijken wat er aan de hand is jullie hoeven niet het probleem op lossen dat wil ik in eerste instantie zelf doen, maar ik moet gewoon even een richting hebben waar ik moet zoeken.
Tenzij jullie zeggen dit is helemaal verkeerd, hoe kan ik het dan het beste aanpakken.

In dit voorbeeld probeer ik op alarm te filteren en het dan in een tekst venster te laten zien dus alleen de alarmen.

PHP:
	<?php
$s_filename = 'log.txt';
$s_alarm =  file_get_contents($s_filename);
$alarm = 'alarm';
$alarm = filter_var($alarm, FILTER_VALIDATE_INT);

var_dump($alarm); // Output: bool(false)
echo'
<html>
<body>
<form method="post">
<center> 
<textarea name="logboek" cols="60" rows="10">'. $s_alarm .'</textarea> <br />
</center>
</body>
</html>
';
?>


Hier heb ik een test log.txt gemaakt waarmee ik oefen.
Code:
alarm   1e alarm
storing 1e storing
log      1e log
alarm  2e alarm
storing 2e storing
log      2e log
alarm  3e alarm
storing 3e storing
log      3e log
alarm  4e alarm
storing 4e storing
log      4e log

Zie graag jullie adviezen tegemoet. :thumb:
 
Ben zelf al een stuk verder gekomen met deze oplossing
PHP:
<?php
$search = 'alarm';
$lines = file('log.txt');
$found = false;
foreach($lines as $line)
{
if(strpos($line, $search) !== false)
{
$found = true;
echo $line;
}
}
if(!$found)
{
echo "<i>Niets gevonden";
}
?>

Maar nu moet ik het nog netjes onder elkaar krijgen het komt nu op 1 regel te staan.
Code:
alarm 1e alarm alarm 2e alarm alarm 3e alarm alarm 4e alarm
Maar ik ban een stap vooruit.
 
Ik weet niet hoe je log.txt eruit ziet maar wat mij het makkelijkste lijkt is als je de array explode.


Als voorbeeld.
PHP:
$str   = 'This is a    string';
$words = preg_split('#\s+#', $str);
 
Momenteel heb ik dit al in elkaar gebouwd snap alleen even niet wat jij bedoeld met.
PHP:
$words = preg_split('#\s+#', $str);
Het script zocht toch al op een woord "alarm" en die werden ook gevonden.


PHP:
 <label>melding:</label>
<form action="#" method="post" id="form_array">
<select name="logen[]" id="logen" size="4" class="none">
  <?php
 $logen = array('storing', 'alarm', 'log', 'algemeen');
 foreach($logen as $log)
 {
  echo '<option value="'.$log.'">'.$log.'</option>'.PHP_EOL;
 }
  ?>
</select>
<p>
 <input type="submit" value="zoek" class="lijnuit" />
<p>					      
        </form>
<?php
$search = '.$log.';
$lines = file('log.txt');
$found = false;
foreach($lines as $line)
{
if(strpos($line, $search) !== false)
{
$found = true;
echo'
<html>
<body>
<form method="post">
<center> 
<textarea name="logscherm" cols="50" rows="10">'. $line .'</textarea> <br />
</center>
</body>
</html>
';
}
}
if(!$found)
{
echo "<i>Niets gevonden";
}
?>

De log file komt er zo uit te zien, en moet dan filteren op het eerste woord bv. "alarm" en dan moeten de meldingen dus in de textarea "logscherm" komen.
Melding Datum Tijd en Tekst
Code:
alarm 12.01.2016 23:12:45 een alarm-1
Storing 26.01.2016 11:11:11 een storings melding-1
alarm 12.01.2016 23:12:45 een alarm-2
Storing 26.01.2016 11:11:11 een storings melding-2
alarm 12.01.2016 23:12:45 een alarm-3
Storing 26.01.2016 11:11:11 een storings melding-3

Met de" display_errors on" krijg ik het volgende te zien, dus ben ik dacht ik wel goed bezig.
PHP:
De $_POST array ziet er als volgt uit:

Array
(
    [logen] => Array
        (
            [0] => alarm
        )

)

Je hebt de volgende gegevens ingevuld:

logen

    alarm
 
Filteren kun je het beste doen met reguliere expressies, daar kun je preg_match() voor gebruiken:

PHP:
<?php
$logTypes = array('storing', 'alarm', 'log', 'algemeen');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $file = file('log.txt');
    
    foreach ($file as $line) {
        preg_match('/^('. $_POST['logType'] .')\s(.+)$/i', $line, $matches);
        if (sizeof($matches) > 0) {
            // var_dump($matches); // Haal uit commentaar voor debugging
            echo $matches[2] ."<br />". PHP_EOL;
        }
    }
}
?>

<form action="" method="post">
    <select name="logType" size="4">
    <?php foreach($logTypes as $logType) {
        echo '<option value="' . $logType . '">'. $logType . '</option>'.PHP_EOL;
    } ?>
    </select>
    <input type="submit" value="Controleer" />
</form>
 
Dank je Tha Devil,

Dit werkt een stuk beter ben er erg blij mee. :love:
Heb hierover nog wel een vraag.
1. de uitkomst wil ik in een tekstarea maken net als op mijn andere pagina's maar als ik het nu doe krijg ik een hele witte lege pagina nu is dit vaak een kwestie van een accolade maar volgens mij staat hier alles goed krijg in mijn "Notepaqq" ook geen fout te zien.

PHP:
                <label>melding:</label>
				 <?php
         $logTypes = array('storing', 'alarm', 'log', 'algemeen');
         if ($_SERVER['REQUEST_METHOD'] == 'POST') {
         $file = file('log.txt');
 
        foreach ($file as $line) {
        preg_match('/^('. $_POST['logType'] .')\s(.+)$/i', $line, $matches);
        if (sizeof($matches) > 0) {
            // var_dump($matches); // Haal uit commentaar voor debugging
			//echo $matches[1]. " - ". $matches[2]."<br />". PHP_EOL;
echo'
<html> 
<body> 
<form method="post">
<center> 
<textarea name="logscherm" cols="50" rows="20">'. $matches[1]. " - ". $matches[2]."<br />". PHP_EOL;.'</textarea> <br />
</center>
</body> 
</html>';
        }
    }
}
?>
 
<form action="" method="post">
    <select name="logType" size="4">
    <?php foreach($logTypes as $logType) {
        echo '<option value="' . $logType . '">'. $logType . '</option>'.PHP_EOL;
    } ?>
    </select>
    <input type="submit" value="Controleer" />
</form>

Ik waardeer het heel erg als je nog een tip zou willen geven :thumb:
 
De foutmelding zit hier:
PHP:
$matches[2]."<br />". PHP_EOL;.'</textarea>

Je zit nog steeds in de echo, dus kun je de regel nog niet afsluiten met ";" ;)

Ook wil je binnen <textarea> geen <br /> hebben staan, die worden dan letterlijk weergegeven, de PHP_EOL moet er als het goed is voor zorgen dat je telkens een nieuwe regel krijgt.
 
Tha devil,

Inderdaad als ik
PHP:
"<br />". PHP_EOL;.
weghaal dan krijg ik wel weer mijn pagina maar krijg nu wel voor elke regel een "textarea" van cols="50" rows="20" dat is nu ook niet de bedoeling de regels moeten in 1 "textarea" onder elkaar.

Ben er wel achter wat het verschil maakt op mijn andere 2 pagina's waar ook dit heb word de tekst uit een tekst bestand gehaald en daar staat alles al onder elkaar.

Dus moet ik toch wel iets als een <br> of en PHP_EOL hebben om de regel af te breken of zie ik dit verkeerd.
 
Bij handleidinghtml.nl kom ik ook niet verder, althans wat het regeleinde in een "textarea" betreft hier word gesproken over "wrap=soft" en "<br>" na de "textarea".
 
Je hebt nu de textarea binnen de foreach staan, zet je foreach binnen <textarea></textarea> en je zult waarschijnlijk jouw gewenste resultaat krijgen ;)
 
Ik geloof dat ik het niet goed begrijp want als ik dat doe dan krijg ik weer een lege wit pagina.
Zo heb ik het nu.
PHP:
<html> 
<body> 
<form method="post">
<center> 
<textarea name="logscherm" cols="50" rows="20">'. foreach ($file as $line) {
        preg_match('/^('. $_POST['logType'] .')\s(.+)$/i', $line, $matches);
        if (sizeof($matches) > 0) {

            echo $matches[1]. " - ". $matches[2]."<br />". PHP_EOL;'</textarea> <br />
		</form>
</center>
</body> 
</html>
 
Je hebt nu de textarea binnen de foreach staan, zet je foreach binnen <textarea></textarea> en je zult waarschijnlijk jouw gewenste resultaat krijgen ;)

Ik ga dit geloof ik niet begrijpen, zie namelijk niet waar de "textarea" binnen de "foreach" staat zo als ik het zie is dat de beide "foreach" in de PHP staan en de "textarea" in de html.
Ben al een tijdje aan het puzzelen geweest maar telkens als ik wat wijzig gaat mijn scherm op wit en leeg.

Ik snap echt niet wat ik fout doe het zal ongetwijfeld iets verrekte simpels zijn maar ik zie en begrijp het dus niet.

Excuseer mijn domheid.
 
Wat Tha Devil bedoelt met 'binnen' komt erop neer dat je de accolades goed moet volgen. Huidige situatie:
PHP:
<?php
	//hier staat wat code
	foreach ($file as $line) { //hier start de foreach
		//hier staat meer code waaronder
		echo'...<textarea name="logscherm" cols="50" rows="20">'. $matches[1]. " - ". $matches[2]."<br />". PHP_EOL;.'</textarea>...';
	} //deze accolade is het einde van de foreach
?>
Nu ga je binnen in je lus telkens een textarea aanmaken, terwijl jij eigenlijk binnen jouw textarea de inhoud wil plaatsen.

Wat handig is, is dat je HTML en PHP gewoon met elkaar kan afwisselen. Je kan dus eerst je paginaopbouw starten in HTML en dan enkel de inhoud van de textarea opvullen met PHP:
PHP:
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>log filteren</title>
</head>
<body>
	<textarea>
<?php
	//we zitten al binnen de textarea, alles wat we nu 'echo'en komt er dus uiteindelijk in terecht
	$logTypes = array('storing', 'alarm', 'log', 'algemeen');
	if ($_SERVER['REQUEST_METHOD'] == 'POST') {
		//haal de file op
		$file = file('log.txt');
		foreach ($file as $line) {
			preg_match('/^('. $_POST['logType'] .')\s(.+)$/i', $line, $matches); //kijken of de lijn overeenkomt met het gevraagde logtype
			if (sizeof($matches) > 0) { //lijn gevonden
				echo $matches[1] . " - " . $matches[2] . PHP_EOL; //lijn naar HTML printen
			}
		} //einde foreach, de lus die lijn per lijn loopt
	}
?>
	</textarea>
</body> 
</html>
 
Hallo JohanTrax,

Oke het begint te komen, dank voor je uitleg dus met accolades kan het wel werken.

Heb het nu gemaakt zoals ik het zou willen maar noppes weer een wit scherm.

PHP:
 <textarea>
<?php
    //we zitten al binnen de textarea, alles wat we nu 'echo'en komt er dus uiteindelijk in terecht
    $logTypes = array('storing', 'alarm', 'log', 'algemeen');
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        //haal de file op
        $file = file('log.txt');
        foreach ($file as $line) {
			 
            preg_match('/^('. $_POST['logType'] .')\s(.+)$/i', $line, $matches); //kijken of de lijn overeenkomt met het gevraagde logtype
            if (sizeof($matches) > 0) { //lijn gevonden
               // echo $matches[1] . " - " . $matches[2] . PHP_EOL; //lijn naar HTML printen
				echo '...<textarea name="logscherm" cols="50" rows="20">'. $matches[1]. " - ". $matches[2]."<br />". PHP_EOL;.'</textarea>...';
            }
        } //einde foreach, de lus die lijn per lijn loopt
    }
?>
    </textarea>
	<form action="" method="post">
    <select name="logType" size="4">
    <?php foreach($logTypes as $logType) {
        echo '<option value="' . $logType . '">'. $logType . '</option>'.PHP_EOL;
    } ?>
    </select>
    <input type="submit" value="Controleer" />
	</form>
Naar mijn menig zou het dus zo moet werken.
 
Laatst bewerkt:
Als het goed is zou je lijn 12 in jouw fragment niet in commentaar moeten gezet hebben en lijn 13 dan terug verwijderen.

Probeer goed te onthouden dat:
1. Alles binnen de foreach (dus tussen zijn accolades) wordt uitgevoerd voor elke lijn in je bronbestand
2. Wat je met echo schrijft letterlijk op die plaats in de HTML wordt ingevoegd, de echo van lijn 13 maakt dus telkens opnieuw een textarea aan en dat wil je niet. Bovendien is de syntax van je lijn 13 fout door de ';' die erin staat.

Als je naar de broncode kijkt via de browser (in de meeste browsers CTRL+U) kan je de resulterende html zien van je code.
Wat is het resultaat als je lijn 13 weghaalt en lijn 12 opnieuw uit commentaar haalt?
 
Hallo Johantrax,

Inderdaad heb ik niet goed opgelet heb helemaal niet gezien dat ik een textarea in een textarea aan het maken was.

PHP:
<center>
<textarea name="logscherm" cols="50" rows="20">
<?php
    //we zitten al binnen de textarea, alles wat we nu 'echo'en komt er dus uiteindelijk in terecht
    $logTypes = array('storing', 'alarm', 'log', 'algemeen');
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        //haal de file op
        $file = file('log.txt');
        foreach ($file as $line) {
             
            preg_match('/^('. $_POST['logType'] .')\s(.+)$/i', $line, $matches); //kijken of de lijn overeenkomt met het gevraagde logtype
            if (sizeof($matches) > 0) { //lijn gevonden
                echo $matches[1] . " - " . $matches[2] . PHP_EOL; //lijn naar HTML printen
                
        } //einde foreach, de lus die lijn per lijn loopt
    }
	}
?>
	
    </textarea>
 </center>

Zo is het nu geworden en het is zoals ik het graag hebben wil moet.
Ik weet wel dat ik zeer goed moet opletten met een stukje code in een script plaatsen.
Als het op de ene pagina wel werkt wil nog niet zeggen dat het op de andere pagina ook werkt met een gewijzigd script.
Het is gewoon stom om dat zo maar aan te nemen.
Zal in de toekomst hier goed opletten wand deze fout had ik zelf moeten ontdekken, maar keek gewoon over het stukje "goed code" heen.
Mijn excuus voor mijn domheid. :o

Erg veel dank voor je uitleg, geduld en tijd. :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan