Auslesen von lokalen htm-Dateien

chill0r55555

Mitglied
Hallo,

ich habe ein Problem mit dem auslesen von htm-Dateien.
Ich habe eine Variable $search diese enthält einen Strin (Suchwort).
Jetzt würde ich gerne nach diesem Wort in der test.htm suchen. Bei einem Treffer soll das Wort vor dem Suchwort und das Wort danach in einer Variable gespeichert werden. Leider finde ich keinen Weg wie ich das realisieren soll.


Bsp:

PHP:
$search = "Besprechung";

test.htm:
Code:
<html>
<head>
<title>test test</title>
</head>
<body>
Hallo Zusammen das ist eine testdatei.<br>
Die Besprechung findet heute in Zimmer 101 statt.
</body>
</html>
(Ich weis man soll hier kein HTML posten, aber ohne ist es nicht möglich das vernünftig zu erklären)

Nun soll er die test.htm durchsuchen. Er stößt auf das Wort Besprechung. Nun soll er das Wort davor und dahinter sowie das Suchwort in einer variable speichern.
So zum Bespiel:

PHP:
$ausgabe <----enthält-- "Die Besprechung findet"

Ist sowas möglich mit PHP zu realisieren ?


MfG
 
Also wenn du dafür nicht mal einen Ansatz hast kannst du IMHO nicht mal ein bissle PHP, sorry. Es gibt ne ganze Hand voll Möglichkeiten das zu lösen, ein wäre z.B.:
PHP:
    $text = "Das ist ein Test mit einem String";
    $suchwort = "Test";
    $words = str_word_count($text,1);
    $key = array_search($suchwort, $words);
    echo $words[$key-1]." ".$words[$key]." ".$words[$key+1];

Ich bin auch kein PHP Pro und hab sowas noch nie gemacht, aber nach 5 Minuten php.net lief das.
 
Joa hast ja recht. Kann halt Schleifen usw aber bei was komplexerem wie das hier hörts bei mir leider auf :( Aber ich danke dir für den Ansatz werd mal probieren das umzubasteln auf mein Vorhaben.
 
Hallo,

ich hätte da nochmals eine Frage zu.
Ich habe eine foreach-Schleife, mit der ich Dokumentnamen (von *.htm-Dateien) einlese sowie deren Inhalt. Ich würde nun gerne diesen Quelltext einbauen. Aber leider scheitert das bei mir.

Mein bisheriger Code sieht so aus:

PHP:
        foreach (glob('*.htm') as $document) 
        {   
          $array = array();
          $anzahl = array();
          $content = strip_tags(file_get_contents($document));
          $array = explode(" ",$content);
          
          for($y=0;$y<count($array);$y++) 
          {
            if ( preg_match("/$search/i",$array[$y]) ) 
            {
              array_push($anzahl,$y);
            }
          }
          //wenn anzahl nicht leer dann ...
          if(!empty($anzahl) ) 
          {         
            //Ankerpunkte für Treffer im Dokument hochzählen
            for($y=0;$y<count($anzahl);$y++) 
            {
              //ausgabe des links für die Treffer
              echo "<li><a href='viewer.php?file=".$document."&search=".$search."#anker".$y."' target=\"MAIN_FRAME\">".$document."</a></li> ";
            }
            // nicht zusammengehörende themen splitten
            echo "<br>";
          }      
        }

( $search entsprich bei mir $_GET['s']. Also dem Inhalt einer Textarea. )


Ich lese die *.htm Dateien ein und speichere pro Durchlauf deren Inhalt in $content. Mein Ziel ist es nun wenn das Wort in $search gleich ist wie eins in einer *.htm Datei dann soll nicht nur der Link ausgegeben werden sondern in einer neuen Zeile auch das Trefferwort sowie das Wort davor und dahinter. Mit dem Code von Sinac klappt das auch wunderbar.
Nur Sobald ich diesen in meinen implementieren will steht nichts mehr in $words drin?

Ich habe probiert direkt nach der Zeile

PHP:
$content = strip_tags(file_get_contents($document));

den Code einzubinden. Natürlich mit Anpassung auf meine Variablen ($search für $suchwort und $content für $text).
Ich bekomme immer die Meldung:

Notice: Undefined offset: -1

Laut PHP-Fehlermeldungen stehen also zu wenig Werte im Array.
(http://www.php-fehlermeldungen.de/artikel,32,notice-undefined-offset,.html)

Was mache ich also falsch ?


MfG
 
Hi, du könntest noch eine for-Schleife einbauen, z.B. so:
PHP:
foreach (glob('*.htm') as $document) 
        {   
          $array = array();
          $anzahl = array();
          $content = strip_tags(file_get_contents($document));
          $array = explode(" ",$content);

          for($x=0;$x<count($array);$x++) {
          if ($search == $array[$x]) {
          echo $array[$x-1]." ".$array[$x]." ".$array[$x+1]."<br>";
          }
          }
          
          for($y=0;$y<count($array);$y++) 
          {
            if ( preg_match("/$search/i",$array[$y]) ) 
            {
              array_push($anzahl,$y);
            }
          }
          //wenn anzahl nicht leer dann ...
          if(!empty($anzahl) ) 
          {         
            //Ankerpunkte für Treffer im Dokument hochzählen
            for($y=0;$y<count($anzahl);$y++) 
            {
              //ausgabe des links für die Treffer
              echo "<li><a href='viewer.php?file=".$document."&search=".$search."#anker".$y."' target=\"MAIN_FRAME\">".$document."</a></li> ";
            }
            // nicht zusammengehörende themen splitten
            echo "<br>";
          }      
        }

edit:

oder du tätigst die Abfrage in der schon vorhandenden for-Schleife
PHP:
foreach (glob('*.htm') as $document) 
        {   
          $array = array();
          $anzahl = array();
          $content = strip_tags(file_get_contents($document));
          $array = explode(" ",$content);
        
          for($y=0;$y<count($array);$y++) {

          if ($search == $array[$y]) {
          echo $array[$y-1]." ".$array[$y]." ".$array[$y+1]."<br>";
          }

            if ( preg_match("/$search/i",$array[$y]) ) {
              array_push($anzahl,$y);
            }
          }
          //wenn anzahl nicht leer dann ...
          if(!empty($anzahl) ) 
          {         
            //Ankerpunkte für Treffer im Dokument hochzählen
            for($y=0;$y<count($anzahl);$y++) 
            {
              //ausgabe des links für die Treffer
              echo "<li><a href='viewer.php?file=".$document."&search=".$search."#anker".$y."' target=\"MAIN_FRAME\">".$document."</a></li> ";
            }
            // nicht zusammengehörende themen splitten
            echo "<br>";
          }      
        }


schiese
 
Zuletzt bearbeitet:
Hallo,

danke für deinen lösungsansatz. So ähnlich hatte ich es auch mal gehabt. Jetzt läuft zwar das Skript wieder ohne Fehlermeldung, aber er gibt mir nur die Links aus sonst nichts.
Hab auch schon probiert die Ausgabe der dann in ne Variable zu machen und als Linkname zu machen, dass hat anscheinend gefunzt (zeigt keine Fehler). Nudie tatsache das er nichts ausgebt besteht halt.Ich versteh das nicht.
 
Ich habe das mal mit dem Code gemacht, den ich vor ein paar Tagen geschrieben habe und da geht es ohne Probleme. Vielleicht hast du einen Fehler im Code.
PHP:
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="text" name="search">
<p>
<input type="submit" value="suchen">
</form> 
<p><br>
<?php  
$m = 1;

if (isset($_POST['search']) ) {
$search = $_POST['search'];
foreach (glob('*.htm') as $document) {
$array = array();
$anzahl = array();
$content = strip_tags(file_get_contents($document));

$array = explode(" ",$content);
for($y=0;$y<count($array);$y++) {

          if ($search == $array[$y]) {
          echo $array[$y-1]." ".$array[$y]." ".$array[$y+1]."<br>";
          }

if ( preg_match("/$search/i",$array[$y]) ) {
array_push($anzahl,$y);
}
}

if(!empty($anzahl) ) {

for($y=0;$y<count($anzahl);$y++) {
if($y == 0) {
echo $m.". <a href='viewer.php?file=".$document."&search=".$search."#anker".$y."' target=\"MAIN_FRAME\">".$document."</a> ";
} else {
echo "<a href='viewer.php?file=".$document."&search=".$search."#anker".$y."' target=\"MAIN_FRAME\">".$y."</a> ";
}
}
echo "<br>";

$m++;

} // Empty-Ende
} // foreach Ende
} // ISSET ENDE
?>

In der Html-Datei steht: --> Ich habe einen Apfel und eine Birne und eine Pflaume
kannst ja mal testen.
Hier

schiese
 
Hi,

jap stimmt. habs gerade getestet. Geht des auf dem Server sowie auch der Code. Mist ich glaub dann hab ich mit meinem String Krams was verbockt. Hier ist mal mein aktueller Code. Ich hab keine Fehlermeldungen oder ähnliches bei dem Code, klappt wunderbar.

PHP:
<?php
//---------------eigene Funktion------------------------------------------
//durchsucht eine htm Datei nach dem Anfangtag TITLE und dem Endtag /TITLE
//der Text dazwischen wird in $title gespeichert.
  function getHTMLTitle($filename)
  {
    $f = fopen($filename, 'rb');
    $data = fread ($f, filesize ($filename));
    $title_start = strpos(strtoupper($data), '<TITLE>');
    if ($title_start)
    {
      $title_start += 7;
      $title_length = strpos(strtoupper($data), '</TITLE>');
      if ($title_length)
      {
         $title_length -= $title_start;
         return substr($data, $title_start, $title_length);
      }
      //else return 'FEHLER: TITEL Ende nicht gefunden';
      else return 'Titel unbekannt';
    }
    //else return 'FEHLER: TITEL Anfang nicht gefunden';
    else return 'Titel unbekannt';
  }
//---------------eigene Funktion------------------------------------------ 
  
  echo "Anzuzeigendes Thema ausw&auml;hlen: <br><br>";
  
// wenn kein Suchbegriff eingegeben wurde Skript abbrechen 
	if(!isset($_GET['s']))
	{	
	 //abbrechen
	 die();
	}
// wenn Suchbegriff eingegeben	
	else
	{
	   // Überprüfung der Länge des Strings, wenn kleiner wie 2 dann Fehlermeldung
		 if (strlen($_GET['s']) < 2)
	   {
       echo "Bitte geben Sie mehr als 2 Zeichen ein!";
     }
     // Wenn Stringlänge OK ...
     else
     {   
     	  //hilfsvariable
	      $result=0;
        // dateinamen der html dateien einlesen
        foreach (glob('*.htm') as $document) 
        {           
          $array = array();
          $anzahl = array();
          
          //aktuellen Dokumentnamen übergeben
          $title = getHTMLTitle($document);
          //hilfsVariable
          $titleNew = 0;
          
          //wenn stringlänge von title länger als 10 dann ...
          if (strlen($title) > 10)
          {
            $punkte = '...';
            //ab dem ersten zeichen zählen und auf 10 zeichen kürzen
            $GekuerzterTitle = substr($title, 0, 26);
            //Punkte an gekürzten text anhängen
            $titleNew = $GekuerzterTitle.$punkte;
          }
          
          $content = strip_tags(file_get_contents($document));

          $array = explode(" ",$content);
          

          for($y=0;$y<count($array);$y++) 
          {        
            if ( preg_match("/$search/i",$array[$y]) ) 
            {
              array_push($anzahl,$y);
            }
          }
          //wenn anzahl nicht leer dann ...
          if(!empty($anzahl) ) 
          {
            //hilfsvariable
            $result=1;

            //Ankerpunkte für Treffer im Dokument hochzählen
            for($y=0;$y<count($anzahl);$y++) 
            {
              //wenn y kleiner wie 1 dann titel ausgeben, ansonsten nicht (Gruppierung)
              if ($y < 1)
              {
                //wenn titel nicht länger als 10 zeichen unveränderten titel ausgeben
                if ($titleNew == 0)
                {
                  echo $title;
                }
                //wenn titel länger als 10 zeichen veränderten titel ausgeben
                else
                {
                  echo $titleNew;
                }
              }
              //ausgabe des links für die Treffer
              echo "<li><a href='viewer.php?file=".$document."&search=".$search."#anker".$y."' target=\"MAIN_FRAME\">".$document."</a></li> ";
            }
            // nicht zusammengehörende themen splitten
            echo "<br>";
          }       
        }
        // Wenn $result Variable ungleich 1, dann Fehlermeldung ausgeben
        if ($result !== 1)
        {
          echo "<br><span style='color:red;'>Es wurden keine mit Ihrer Suchanfrage - <b>".$search."</b> - übereinstimmenden Dokumente gefunden.</span>";
        }
     }
  }
?>


MfG
 
Zuletzt bearbeitet:
Zurück