perl to php suchscript

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • perl to php suchscript

    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. 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'];
    $datei = file($auswahl[0]);
    $i=count($datei)-1;
    $header = $datei[0];
    unset($datei[0]);

    $suche= $_POST['suche'];
    $suchbegr = explode(" ", $suche);

    foreach ($suchbegr as $suchb){//liefert alle ODER zurück
    foreach ($datei as $line) {
    if (preg_match("/$suchb/",$line)){
    $lin = str_replace($suchb, "<b>" .$suchb ."</b>", $line);
    $result[]=$lin;
    }

    }
    }

    print "<p><font color=\"blue\">" .$header ."</font><br>";
    print "Es wurden " .count($result) ." Beitr&auml;ge in " .count($datei). " Literaturangaben gefunden.</p>";
    print "<hr>";
    for($x=0;$x<count($result);$x++)
    {
    echo "<p>" .$result[$x] . "</p>";
    }

    ?>


    Was mir noch fehlt ist eine Verzweigung, die nach UND / ODER unterscheidet und die Suche entsprechend ändert. Im Formular habe ich hierzu ein weiteres select eingebaut, das zwischen "und" / "oder" unterscheidet.

    Ausserdem liefert mein Skript bei mehreren Suchbegriffen auch mehrfach die gleichen Zeilen, wobei jeweils auch nur ein Suchbegriff fett-hervorgehoben ist.

    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.

    Zudem wundert es mich immer wieder, dass es nicht so eine einfache Funktion gibt, die ein array $C ausgibt in dem nur die Strings aus array $B enthalten sind in denen Strings aus array $A zu finden sind.

    Oder ich muss das bislang übersehen haben?

    Gruß
    Georges

  • #2
    Habe das mittlerweile hinbekommen.
    ich möchte das hier nur posten, falls mal jemand etwas ähnliches sucht.

    PHP-Code:
    <?
    /*  
    $subjects ist ein Array, das die Suchbegriffe enthält
    $file enthält den Pfad zur Datei
    $matches ist ein Array, in das die gefundenen Zeilennummern geschrieben werden
    $type enthält die Art, wie gesucht wird (AND bzw. OR)
    'search' ist der Name des Texteingabefeldes im Formular
    'files' ist der Name des Auswahlfeldes wobei die einzelnen Text-Dateien (.txt oder .csv)
    mit ihrem Pfad folgendermassen übergeben werden:
       <option value="./verzeichnis/Datei.txt">Name</option>
    'boolean' Auswahlfeld mit den Optionen AND und OR:
       <option value="AND">und</option>
       <option value="OR">oder</option>
    Viel Erfolg bei der Suche!
    */

    $search= $_POST['search'];
    if ("" == $search) {
    print "<p><b><font color=\"red\">Sie haben kein Suchbegriff angegeben!</font></b></p>\n<br>\n<br>\n";
    }
    else 
    {

        $search= $_POST['search'];
        $subjects = explode(" ", $search);                            
        $files= $_POST['files'];
        $type= $_POST['boolean'];


              foreach ($files as $file) {
             
                    $matches = array();
                $content = file($file);
                $header = $content[0];// Die erste Zeile kann für Inhaltsangaben genutzt werden
                        unset($content[0]);
            
                foreach($content as $lineno => $line) {
                    switch($type) {
                    case 'AND':
                        $foundAll = true;
                        foreach($subjects as $subject) {
                            //  wenn einer der Suchbegriffe nicht gefunden wurde, abbrechen
                            if(strpos($line, $subject) === false) {
                                $foundAll = false;
                                break;
                            }
                        }
                        if($foundAll === true)
                           $matches[] = $lineno;
                        $matches = array_unique($matches);
                        
                        break;
                    case 'OR':
                        foreach($subjects as $subject) {
                            if(strpos($line, $subject) !== false) {
                                $matches[] = $lineno;
                                break;    //  nach dem ersten Treffer in dieser Zeile können wir die Suche abbrechen
                            }
                        }
                        $matches = array_unique($matches);
                                            break;
                    }
                }
       
                print "<br>";
                    print "<p><b>Im Verzeichnis: </b><font color=\"blue\">" .$header ."</font><br>";
                    if (count($matches)==1){
                    print "wurde " .count($matches)." Beitrag in " .count($content). " Literaturangaben gefunden.</p>";
                    }
                else {
                    print "wurden " .count($matches)." Beitr&auml;ge in " .count($content). " Literaturangaben gefunden.</p>";
                    } 
                    print "<hr>";
                
                            foreach($matches as $lineno) {
                                            foreach ($subjects as $subject) {
                                            $content[$lineno]= str_replace($subject, "<b>".$subject."</b>", $content[$lineno]);
                                            }
                        print "<p>" .$content[$lineno] . "</p>";

                    }
                    }
    }
    ?>
    Falls Fehler auftauchen oder jemand Verbesserungsvorschläge hat, kann er das ja hier posten.

    Gruß
    Georges

    Kommentar

    Lädt...
    X