String splitten

Diskutiere mit über: String splitten im Web-Programmierung Forum

  1. sevY

    sevY Thread Starter Gast

    Hi,

    ich möchte folgendes.

    PHP:
    $string='Das ist ein Satz. Das ist der Satz mit dem Suchwort LALA. Das ist noch ein Satz';

    //Gib mir $string aus, aber nur den Satz, der das Suchwort 'LALA' enthält. 

    Also muss im Prinzip der String auf das Suchwort geprüft werden und dann vom Suchwort ausgehen am Punkt (.) danach und nach dem Punkt (.) davor abgeschnitten werden.

    Liebe Grüße

    Yves
     
  2. Horror

    Horror MacUser Mitglied

    Beiträge:
    1.416
    Zustimmungen:
    9
    Registriert seit:
    03.02.2003
    Am einfachsten wäre da wohl eine Konstruktion über REGEXP (reguläre Ausdrücke). Aber ich vermute es wird eine hässliche Konstruktion ;)

    Horror
     
  3. aguilera

    aguilera MacUser Mitglied

    Beiträge:
    48
    Zustimmungen:
    0
    Registriert seit:
    09.03.2004
    $aSaetze = explode(".", $string);

    Nun jedes Element von $aSaetze testen. Fertig.
     
  4. Gibberish

    Gibberish MacUser Mitglied

    Beiträge:
    46
    Zustimmungen:
    0
    Registriert seit:
    17.04.2004
    Moin, moin!

    Wie Horror schon sagte sind Reguläre Ausdrücke hier das eleganteste.

    Zum Beispiel so:
    PHP:
    <?php

    $string 
    'Das ist ein Satz. Das ist der Satz mit dem Suchwort LALA. Das ist noch ein Satz';

    $pattern "/(?:\w|\s)+LALA(?:\w|\s)*\./";
    if(
    preg_match($pattern$string$match) > 0)
    {
      echo 
    $match[0] . "\n";
    }

    ?>
    Bis neulich ...
     
  5. sevY

    sevY Thread Starter Gast

    H,

    vielen Dank! Der Lösungansatz ist genau das, was ich brauche. Aber leider funktioniert das in meiner Funktion nicht. Es wird entweder kein Ergebniss, oder immer nur ein Ergebnis ausgegeben.

    Hier die function.inc.php

    PHP:
    <?php
    //Verzeichnis wird auf definierte Dateien gescannt

    function scanFiles($path,$key,$type)
        {
        
    $handle=opendir($path);
        
    $i=0;
        while(
    $file=readdir($handle))
            {
            if(
    $file!='.' && $file!='..' && preg_match('/.'.$type.'/i',$file))
                {
                if(
    preg_match('/'.$key.'/i',strip(readContent($path,$file))))
                    {
    //Suchwort wird markiert und ein Href wird konkateniert, welcher in einem Array returned wird.
                    
    $result[$i]='<a href="'.$file.'" target="_self">'.eregi_replace($key,'<b>'.strtoUpper($key).'</b>',strip(readContent($path,$file))).'</a>';
                    
    $i++;
                   
                    
    /*
                    preg_match('/(?:\w|\s)+'.strtoupper($key).'(?:\w|\s)*\./', strip(readContent($path,$file)), $match);
                    $result[$i]='<a href="'.$file.'" target="_self">'.eregi_replace($key,'<b>'.strtoUpper($key).'</b>',$match[0]).'</a>';
                    $i++;            */
                    
    }
                }
            }
        return 
    $result;
        
    closedir($handle);
        }

    //Datei wird ausgelesen
    function readContent($path,$file)
        {
        
    $binaries=fopen($path.$file,'rb');
        
    $scan=fread($binaries,filesize($path.$file));
        return 
    $scan;
        }
        
    //Plain Text erzeugen
    function strip($content)
        {
        
    $content=preg_replace('/(\<script)(.*?)(script>)/si','',$content);
        
    $content=strip_tags($content);
        
    $content=str_replace('<!--','&lt;!--',$content);
        
    $content=preg_replace('/(\<)(.*?)(--\>)/mi',''.nl2br('\\2').'',$content);
        return 
    $content;
        }
    ?>

    Und so binde ich das ein…

    PHP:
                if(isset($_POST['operation']))
                    {
                    echo
    '
                        <span class=ttl>
                            <b>Suchergebnisse</b>
                        </span>
                        '
    ;
                    if(
    strlen($_POST['key'])>=3)
                        {
                        
    $return=scanFiles(getcwd().'/',$_POST['key'],'shtml');
                        if(!empty(
    $return))
                            {
                            foreach(
    $return as $result)
                                {
                                echo 
    '<p>'.$result.'</p>';
                                }
                            }
                        else
                            {
                            echo
    '<p>Die Suche nach <b>'.strtoupper($_POST['key']).'</b> ergab keine Ergebnisse.</p>';
                            }
                        }
                    else
                        {
                        echo
    '<p>Das Suchwort mu&szlig; mindestens 3 Zeichen lang sein.</p>';
                        }                   
                    }
    Hat jemand eine Idee?

    Liebe Grüße

    Yves
     
  6. Gibberish

    Gibberish MacUser Mitglied

    Beiträge:
    46
    Zustimmungen:
    0
    Registriert seit:
    17.04.2004
    Was steht denn in $key und woher kommt der Wert?
    Wenn in Key nur das zu suchende Wort steht macht nämlich "preg_match('/'.$key.'/i',..." nicht viel Sinn, da Du ja den ganzen zugehörigen Satz haben wolltest, oder doch nicht?!
    Was genau willst Du haben? Von mehrere Vorkommen o.ä. war in Deinem ersten Posting nicht die Rede.

    Bis neulich ...
     
  7. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.029
    Zustimmungen:
    1.314
    Registriert seit:
    13.09.2004
    Das ist genau der Grund warum ich weitestgehend einen Bogen um regex mache. Die Lösung von aguilera mag die manuelle Variante sein. Sie ist jedoch eingängiger und leichter wartbar, da man sie auch nach Monaten noch sofort versteht! Regex verwende ich nur, wenn nichts anderes mehr hilft.
     
  8. Gibberish

    Gibberish MacUser Mitglied

    Beiträge:
    46
    Zustimmungen:
    0
    Registriert seit:
    17.04.2004
    Hä? Was ist "genau der Grund"?

    Soso. IST sie das oder empfindest DU sie als einfacher?
    Im Übrigen dürfte diese Variante um ein vielfaches langsamer sein.

    Und warum sollte das bei RegExpr nicht der Fall sein? Vorausgesetzt man arbeitet regelmäßig mit RegExpr.

    Ist ja auch in Ordnung. Ich selber nutze es aber bei jeder passenden Gelegenheit. Immer wenn ich irgendetwas mit Stringbearbeitung zu tun hab kommt RegExpr ins Spiel.
    Auch in Fällen wo ein einfaches substr() o.ä. genauso funktionieren würde nehme ich aus Geschwindigkeitsgründen immer gerne RegExpr.

    Bis neulich ...
     
  9. wegus

    wegus MacUser Mitglied

    Beiträge:
    15.029
    Zustimmungen:
    1.314
    Registriert seit:
    13.09.2004
    @Gibberish:
    Nun mal nicht so empfindlich! Ich arbeite täglich mit PHP ( seit Version 3.04 vor fünf Jahren). Habe demzufolge auch fünf Jahre alte Skripte von unterschiedlichen Programmierern hier. Regex ist eben nicht leicht lesbar,
    auch für alte Perl-Hasen nicht und ich kann auch perl! Das mit der Rechenzeit relativiert sich mit der Rechenleistung der Server und scheint mir eher akademisch zu sein! Du darfst es ja gerne anders sehen und nat. gibt es Fälle wo nur regex Sinn macht. Ich persönlich zähle den obigen genau nicht dazu,
    aber das ist meine persönliche Meinung

    Gruß Karsten
     
  10. Gibberish

    Gibberish MacUser Mitglied

    Beiträge:
    46
    Zustimmungen:
    0
    Registriert seit:
    17.04.2004
    Doch. Auf "DAS IST so weil ICH soundso arbeite" reagiere ich immer empfindlich.
    Wenn jemand sagt "Ich empfinde Lösung XY als eleganter" hab ich kein Problem damit aber zu sagen "Lösung XY ist eleganter" und dann nichtmal eine Begründung mitzuliefern kann ich nicht ab.

    AHH.. Da ist wieder dieses IST! Du findest RegEx nicht leicht lesbar aber deswegen IST es das noch lange nicht.
    Außerdem hängt das immer stark vom Anwendungsfall ab und eine RegEx, die das hier genannte Problem behandelt, halte ich sehr wohl für leicht lesbar. Und da wo RegEx wirklich unleserlich werden käme man mit explode() oder anderen stringfunktionen ohnehin kaum weiter.

    Aha.. anstatt die Software zu optimieren/beschleunigen kaufe ich also lieber neue Hardware. Und nein es ist nicht akademisch und das solltest Du mit 5 Jahren Erfahrung eigentlich wissen.
    Natürlich merkt man bei 1000 Wörtern keinen Unterschied aber bei mehreren hundert MB Text ändert sich die Laufzeit schon ganz gewaltig.

    danke zu gnädig. :)

    Wobei der o.g. Fall nicht ausreichend spezifiziert ist.
    Guck Dir z.B. mal den Speicherbedarf an, wenn Du über 100MB Text ein explode(".", ... machst und tausende von Strings in ein Array geballert werden um diese hinterher alle wieder zu durchlaufen. Bei 3-4 Sätzen ist das ganze natürlich kein Problem.

    Bis neulich ...
     
Die Seite wird geladen...
Ähnliche Themen - String splitten Forum Datum
String in Mehrdimensionales Array wandeln Web-Programmierung 17.01.2009
Mit Perl bestimmten String suchen Web-Programmierung 13.10.2007
Was ist das für ein String? Web-Programmierung 02.01.2005

Diese Seite empfehlen

Benutzerdefinierte Suche