Das Skript, das ich derzeit versuche auf php-Beine zu stellen, habe ich bereits mit viel Zeit und Mühe als perl.pl-Script laufen (live kann man das unter Ag Freiraum und Vegetation sehen). Ich will das php-Skript dann später in eine neue, mit Joomla! (Mambo) verwaltete Seite integrieren. Das kann ich zwar jetzt auch per wrapper, aber da ist eine direkte php-Lösung doch eleganter. Ausserdem wollte ich immer schon mal in php reinschnüffeln.
Soweit.
Ich bin mit meinem Skript schon soweit, dass ich mehrere Begriffe suchen lassen kann. Zudem kann ich die Quelldatei in einem select-Feld auswählen oder mehrere wählen. Die erste Zeile dient als Inhaltsbeschreibung und wird farblich anders dargestellt. Der gesuchte Begriff wird in der Ausgabe fett dargestellt.
Meine bisherige Arbeit sieht bislang folgendermassen aus:
PHP-Code:
<?
$auswahl= $_POST['auswahl'];
foreach ($auswahl as $datei) {
$zeilen=file($datei);
$i=count($zeilen)-1;
$header = $zeilen[0];
unset($zeilen[0]);
$suche= $_POST['suche'];
$suchbegr = explode(" ", $suche);
foreach ($zeilen as $line){
foreach ($suchbegr as $suchb) {
if (preg_match("/$suchb/",$line)){
$lin = str_replace($suchb, "[b]" .$suchb ."[/b]", $line);
$result[]=$lin;
}
}
}
print "
</p>
[b]Im Verzeichnis: [/b]<font color=\"blue\">" .$header ."</font>
";
print "wurden " .count($result) ." Beiträge in " .count($zeilen). " Literaturangaben gefunden.</p>";
print "<hr>";
for($x=0;$x<count($result);$x++){
echo "
" .$result[$x] . "</p>";
}
}
?>
Ich habe aber das Problem, dass bei mehreren ausgewählten Quelldateien die Ausgabe immer die gefundenen Treffer der vorangegangenen Suche mit aufführt. Muss ich das Array $result leeren?
Ausserdem will ich die Möglichkeit haben, bei der Suche zwischen UND / ODER bei der Eingabe mehrerer Suchbegriffe zu wechseln.
In dem Perl-skript habe ich das mit Hilfe einiger Forumsmitgliedern (allen sei herzlich gedankt) wirklich elegant und mit wenigen Zeilen Code hinbekommen. Nur kann ich das nicht für mich in php übersetzen.
in perl sieht der zentrale Suchteil dann so aus:
code:
if ($BOOL eq 'oder'){
foreach $text (@TEXTS) {
if($line =~ /$text/){
$line=~ s/$text/[b]$text<\/b>/g; # Highligt the text found
&result;
}
}
}
elsif ($BOOL eq 'und') {
my $nomatch = @TEXTS;
for my $text (@TEXTS) {
my $textnometa = quotemeta ($text);
last unless $line =~ s/$textnometa/[b]$text<\/b>/g;
--$nomatch;
}
&result unless $nomatch;
}
Mir kommt es so vor, als ob ich die brauchbarsten Möglichkeiten in php übersehen habe und deshalb eine einfache und knappe Methode übersehen habe.
Vielleicht kann mir ja jemand weiterhelfen?
Gruß Georges