benötige Hilfe bei Suche in html-Dateien

chill0r55555

Mitglied
Hallo,

ich habe vor einiger Zeit eine Suche in PHP programmiert, die es mir ermöglich in html-Dateien nach einem von mir gewählten String zu suchen. Nur jetzt bin ich an einem punkt angekommen wo ich selber nichtmehr weiter weis. Es geht um folgendes:

Ich durchsuche ja die html-Dateien nach einem String. Ist dieser in einer html-Datei vorhanden, wird ein Link zu der Datei ausgegeben. Klicke ich nun den Link an wird die html-Datei geöffnet die meinen String enthält. Ich würde es aber gerne so haben, dass wenn ich den Link klicke, die Datei öffne und dann auch gleich zu der stelle springe an der der String vorkommt. Es ist ja zb auch möglich das das Wort 10 mal oder so in einer datei vorkommen kann. Wie könnte ich hier vorgehen. Ich habe leider nicht soviel know-how in PHP deshalb würde ich euch bitten nicht zusehr mit Fachbegriffen um euch zu werfen.

Hier ist mein bisheriger Code:

PHP:
<?php  
        // dateinamen der html dateien einlesen
        foreach (glob('*.html') as $document) 
        {
           // Inhalt der html Dateien einlesen und in $content speichern
           $content = strip_tags(file_get_contents($document));
           // nach Suchmuster $search in $content suchen und bei Treffer ausgabe
           if (preg_match_all('/'.$search.'/i',$content,$treffer) !== 0)
           {
             // Durchlauf von $treffer und zuweisung des aktuellen Elements an $a1; Erhöhung 
             // des Array Zeigers um 1 
             foreach($treffer as $a1) 
             {
               // Weist bei jedem Durchlauf den aktuellen Schlüssel der Variablen $a2 zu
               foreach ($a1 as $a2) 
               {
                // Ausgabe des Dateinames als Link
                echo('<li><a href="'.$document.'" target="MAIN_FRAME">'.$document.'</a></li>'.PHP_EOL);
               }
             }
           
           }

        }

      }
  }
?>

MfG
 
Zuletzt bearbeitet:
Du könntest anstatt dem Link auf die HTML-Datei einen Link auf ein PHP-Script ausgeben und diesem als Parameter den Namen der HTML-Datei und den Suchtext übergeben.
z.B. viewer.php?file=datei.html&search=Text

Im Script viewer.php lädst du dir dann den Inhalt der HTML-Datei in eine Variable und umschließt mittelst preg_replace() die zu suchende(n) Stelle(n) mit Highlight-Tags (z.B. Fettschrift, Hintergrundfarbe, etc.)
Wenn du zum ersten Vorkommen springen möchtest, gehst du genau so vor und umschließt einfach den ersten Treffer mit einer Textmarke (z.B. match). Dann muss der aufzurufende Link aber auch entsprechend die Textmarke berücksichtigen:
z.B. viewer.php?file=datei.html&search=Text#match

Ich hoffe, das hilft dir weiter!
 
Du könntest anstatt dem Link auf die HTML-Datei einen Link auf ein PHP-Script ausgeben und diesem als Parameter den Namen der HTML-Datei und den Suchtext übergeben.
z.B. viewer.php?file=datei.html&search=Text

Im Script viewer.php lädst du dir dann den Inhalt der HTML-Datei in eine Variable und umschließt mittelst preg_replace() die zu suchende(n) Stelle(n) mit Highlight-Tags (z.B. Fettschrift, Hintergrundfarbe, etc.)
Wenn du zum ersten Vorkommen springen möchtest, gehst du genau so vor und umschließt einfach den ersten Treffer mit einer Textmarke (z.B. match). Dann muss der aufzurufende Link aber auch entsprechend die Textmarke berücksichtigen:
z.B. viewer.php?file=datei.html&search=Text#match

Ich hoffe, das hilft dir weiter!

Hallo split,

danke schonmal für die Anregung. Also den Link zu ändern war kein problem für mich:

PHP:
echo('<li><a href="viewer.php?file='.$document.'&search='.$search.'" target="MAIN_FRAME">'.$document.'</a></li>'.PHP_EOL);

Funktioniert auch wunderbar, hab in der viewer.php die Variablen mal zum test ausgegeben.
Den Dateiinhalt einlesen konnte ich auch ohne Probleme.
Nur bei dem preg_replace fings leider an nimmer so gut zu klappen. Was du mit diesem match meinst habe ich auch nicht so ganz verstanden.

Hier ist mein Code der viewer.php.

PHP:
<?php
$file = $_GET['file'];
$search = $_GET['search'];

// Inhalt der html Dateien einlesen und in $content speichern
$content = strip_tags(file_get_contents($file));
$ersetzung = '?';
echo preg_replace($search, $ersetzung , $content);
?>

Was muss ich denn anstatt des Fragezeichen einsetzen ? Das ist ja der Ersatz also durch was ersetzt wird. Aber ich steig leider nicht ganz durch wie ich das angeben muss.

MfG
 
Zuletzt bearbeitet:
Hi,
ich habe mir auch mal so eine Suche gebastelt. Ich zeig dir mal meinen Code zum Färben der Treffer:
PHP:
<?php

$datei = strip_tags($_GET['datei']);
$suchbegriff = strip_tags($_GET['suchbegriff']);

if ( !file_exists($datei) ) {
echo "datei existiert nicht!";
} else {
$inhalt = file_get_contents($datei);
$strippen = strip_tags($inhalt);
$fertig = preg_replace("/$suchbegriff/isU","<span style='color:red'>$0</span>", $strippen);

echo $fertig;

}

?>
Ich habe drauf verzichtet, HTML auszugeben, nur unformatierten Text!

schiese
 
Hi,
ich habe mir auch mal so eine Suche gebastelt. Ich zeig dir mal meinen Code zum Färben der Treffer:
PHP:
<?php

$datei = strip_tags($_GET['datei']);
$suchbegriff = strip_tags($_GET['suchbegriff']);

if ( !file_exists($datei) ) {
echo "datei existiert nicht!";
} else {
$inhalt = file_get_contents($datei);
$strippen = strip_tags($inhalt);
$fertig = preg_replace("/$suchbegriff/isU","<span style='color:red'>$0</span>", $strippen);

echo $fertig;

}

?>
Ich habe drauf verzichtet, HTML auszugeben, nur unformatierten Text!

schiese

Hallo,
danke dir für den Code hab den ml bei mir reingemacht und ich kann nun schonmal die Treffer färben. Aber wie wäre es realisierbar direkt zu einem Treffer zu springen wenn ich auch einen Link klicke. Ich versteh leider die Idee von split nicht so ganz :(

MfG



Edit:

Ich habe es jetzt mal geschafft zu der marke zu springen.

Viewer.php
PHP:
<?php
$file = $_GET['file'];
$search = $_GET['search'];

// Inhalt der html Datei einlesen und in $content speichern
$content = strip_tags(file_get_contents($file));
//echo preg_replace("/$search/isU", "<span style='color:red'>$0</span>", $content);
echo preg_replace("/$search/isU", "<a name='ankername'><span style='color:red'>$0</span></a>", $content);
?>

nur hier ist ja der Name des Ankers fest angegeben.
Und wenn ich den Link generiere ist der Name des Ankers auch fest im Code:

PHP:
echo('<li><a href="viewer.php?file='.$document.'&search='.$search.'#ankername" target="MAIN_FRAME">'.$document.'</a></li>'.PHP_EOL);

Ich kann ja jetzt nicht wieder zurückübergeben zu der suche.php oder wie soll ich das machen :confused:
 
Zuletzt bearbeitet:
Hi,
ich verstehe dein neues Problem irgendwie nicht.

Wenn du den Code so behälst, hast du bei mehreren Übereinstimmungen mehrere Anker. Ich weiß nicht, ob es so Fehler geben kann.
Sonst kannst du es auch so machen:
PHP:
echo preg_replace("/$search/isU", "<a name='ankername'><span style='color:red'>$0</span></a>", $content,1);
So wird aber nur der erste Treffer rot gefärbt.

schiese
 
Es ist ja so das ich meinen Suchbegriff in eine textbox eingebe. Dann klicke ich auf den Button Suchen. Danach listet er mir Ergebnisse auf. Also Links zu den Dateien in denen mein Suchwort vorkommt. Ich suche zb nach "test". Dann sucht er. Er findet "test" in der test.html. Dann macht er mir einen Link auf diese Datei.
Ich würde aber nun das ganze gerne so haben, falls "test" mehrmals in der test.html vorkommt soll er deshalb immer genau zu der Stelle springen an der das Wort steht. Also einen Ankerpunkt machen. So wie ich es jetzt habe springt er zwar zu dem Anker aber immer nur zu dem ersten Vorkommen in der Datei, da ja alle Anker gleich heissen, nimmt er den ersten den er findet.

Des weiteren ist es möglich die eingelesene Html Datei wieder formatiert auszugeben? Also nicht nur reinen Text? Ich habe in den html Dateien halt Formatieren wie fettschrift, Überschrift, ... drinnen sowie Bilder. Und das "verschluckt" er bei meinem jetztigen Code. Also er gibt nur den reinen text aus.
Ich hoffe das war verständlicher.

MfG
 
PHP:
<?php
$file = $_GET['file'];
$search = $_GET['search'];

// Inhalt der html Datei einlesen und in $content speichern
$content = file_get_contents($file);
//echo preg_replace("/$search/isU", "<span style='color:red'>$0</span>", $content);
echo preg_replace("/$search/isU", "<a name='ankername'><span style='color:red'>$0</span></a>", $content);
?>

Dazu musst du einfach strip_tags weglassen.

schiese
 
Hey Cool danke dir!
Jetzt muss ich das mit meinen Ankerpunkten noch hinbekommen, dann bin ich fürs erste mal bis auf ein paar kleine Bugs bei der Suche eigentlich fertig. Ich quäl dazu nochmals :google: ich hoff ich find diesmal was dazu. Weil so wie ich jetzt habe ist ja dumm, ich brauch ja für jeden Treffer einen eigenen Anker damit er direkt zu dem jeweiligen Treffer springt.


MfG


Edit:
Ich habe jetzt mal ne Eigenkreation gebastelt aber scheint nicht zu klappen.... :(
Idee war die Variable counter bei jedem Schleifendurchlauf hochzuzählen und den jeweiligen Wert als Ankername und als count Variable zu nehmen. Diese Count Variable übergeb ich dann. Hier mal der Code dazu. geht aber leider nicht. Hat da jemand eine Idee warum ?

suche.php
PHP:
         if (preg_match_all('/'.$search.'/i',$content,$treffer) !== 0)
           {
             // Variable setzen
             $result=1;
             $counter=0;
             // Durchlauf von $treffer und zuweisung des aktuellen Elements an $a1; Erhöhung 
             // des Array Zeigers um 1 
             foreach($treffer as $a1) 
             {
               // Weist bei jedem Durchlauf den aktuellen Schlüssel der Variablen $a2 zu
               foreach ($a1 as $a2) 
               {
               $counter++;
                // Ausgabe des Dateinames als Link
                //echo('<li><a href="'.$document.'" target="MAIN_FRAME">'.$document.'</a></li>'.PHP_EOL);
                echo('<li><a href="viewer.php?file='.$document.'&search='.$search.'&count='.$counter.'#'.$counter.'" target="MAIN_FRAME">'.$document.'</a></li>'.PHP_EOL);
               }

viewer.php
PHP:
<?php
$file = $_GET['file'];
$search = $_GET['search'];
$counter = $_GET['count'];
// Inhalt der html Datei einlesen und in $content speichern
$content = file_get_contents($file); 
// Worttreffer mit einem Anker versehen und rot markieren
echo preg_replace("/$search/isU", "<a name='.$counter.'><span style='color:red; font-weight: bold'>$0</span></a>", $content);
?>
 
Zuletzt bearbeitet:
Habe mal was gebastelt, was auch so weit klappt!
PHP:
$file = $_GET['file'];
$suchbegriff = $_GET['search'];
// Inhalt der html Datei einlesen und in $content speichern
$content = file_get_contents($file);  
$x = 0;
$array = explode(" ",$content);
for($y=0;$y<count($array);$y++)  {
if ( preg_match("/$suchbegriff/isU",$array[$y]) ) {
$array[$y] = preg_replace("/$suchbegriff/isU","<a name='anker".$x."'><span style='color:red'>$0</span></a>", $array[$y],1);
$x++;
}
}
$string = implode(" ",$array);
echo $string;

schiese
 
Zuletzt bearbeitet:
Zurück