tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
458
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    slimox slimox ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    82
    Hallo,

    Da steht ich schon wieder an.. Es gibt eine DB-Tabelle mit Spalte "Name" und Spalte "Text1". Jetzt habe ich eine einfaches Input-Feld mit welchem in der DB gesucht werden kann. Gibt Jemand jedoch ein Wort ein, welches nicht im Name oder Text vorkommt so findet es nicht. Logisch

    Meine Idee: Mit jQuery Autocomplete laufend Name oder Wörter aus dem Text1 einblenden, in welchen der Suchbegriff vorkommt.

    Wenn ich nur im Feld "Name" suche ist das auch keine Sache, dann gebe ich einfach den ganzen Namen aus.

    Das Problem: Eine SQL Abfrage, welche im Name und im Text1 sucht. Findet es im Text1 den Suchbegriff, dann mit PHP nur die Wörter vom Text1 ausgeben in welchen der Suchbegriff vorkommt.

    SQL für Test:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    --
    -- Tabellenstruktur für Tabelle `dbsuche`
    --
     
    CREATE TABLE IF NOT EXISTS `dbsuche` (
      `id` int(11) NOT NULL auto_increment,
      `name` text NOT NULL,
      `text1` text NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
     
    --
    -- Daten für Tabelle `dbsuche`
    --
     
    INSERT INTO `dbsuche` (`id`, `name`, `text1`) VALUES
    (1, 'Äpfel', 'Die Äpfel (Malus) bilden eine Pflanzengattung der Kernobstgewächse (Pyrinae) au'),
    (2, 'Birnen', 'Die Birnen (Pyrus) bilden eine Pflanzengattung, die zu den Kernobstgewächsen'),
    (3, 'Banane', 'Banane steht für: Bananen (Musa), eine Gattung in der Familie der Bananengewächse');

    Abfrage
    PHP-Code:
    $woerter = array();

    $sql "SELECT
                name, text1,
                IF( name  REGEXP '
    $search', 3, 0 ) AS inName,
                IF( text1  REGEXP '
    $search', 1, 0 ) AS inText1
            FROM
                dbsuche
            WHERE
                name REGEXP '
    $search'
            OR
                text1 REGEXP '
    $search'
            ORDER BY
                (inName + inText1)
            DESC
            LIMIT 10"
    ;

    $query $this->db->query($sql);
    foreach (
    $query->result() as $row){
        
    //Wenn im Namen gefunden
        
    if($row->inName >= 3){
            
    $woerter[] = $row->name;
        }
        
        
    //Wenn im Text gefunden
        
    if($row->inText1 >= 1){
            
    //Wie bekomme ich nur die Wörter in denen der Suchbegriff ist?
            
    $row->text1;
        }

    In der VAR $row->text1 ist der ganze Text. Wie bekomme ich nur die Wörter in denen auch der Suchstring passt?

    Gibt Jemand "Banan" ein so sollte es diese Wörter ausspucken:
    Banane, Bananen, Bananengewächse

    Für alle AW's dankbar!
    Geändert von slimox (04.11.11 um 16:12 Uhr) Grund: OR in SQL
     

  2. #2
    Avatar von Yugeen
    Yugeen Yugeen ist offline Mitglied Silber
    Registriert seit
    Sep 2011
    Beiträge
    69
     

  3. #3
    Avatar von para_noid
    para_noid para_noid ist offline Mitglied Gold
    Registriert seit
    Aug 2011
    Beiträge
    144
    Oder du verwendest preg_match_all, die Treffer landen dann in einem Array. Wenn ich das richtig verstanden hab könntest du dafür denselben regulären Ausdruck verwenden, den du schon in der Abfrage drin hast.

    @stutz: müsste hier
    Code sql:
    1
    2
    3
    4
    
    WHERE
     name REGEXP '$search'
    AND
     text1 REGEXP '$search'
    nicht ein OR stehen?
    Geändert von para_noid (04.11.11 um 15:45 Uhr)
     
    Für die Übereinstimmung von Niederschrift und Hirninhalt.

  4. #4
    slimox slimox ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    82
    Das mit jQuery ist nit mein Prob

    müsste hier nicht ein OR stehen?
    Doch da müsste ein OR sein! Sonst ist die Trefferquote sehr schlecht

    Wie sollte das pattern aussehen?

    Ein Beispiel:
    PHP-Code:
    $needle 'anan';
    $text 'Eine gerade Banane, nein!';

    //Das sollte es finden
    array('Banane'
    Hast du eine Idee?
     

  5. #5
    Avatar von para_noid
    para_noid para_noid ist offline Mitglied Gold
    Registriert seit
    Aug 2011
    Beiträge
    144
    Ich steh mit regulären Ausdrücken n bisschen auf Kriegsfuß...

    Was hast du denn in $search drin? Das sollte sich doch schonmal als Basis nutzen lassen. Nach meiner Vorstellung müsstest du "nur" zusätzlich regeln, dass die Treffer vom vorherigen bis zum nächsten Leerzeichen gehen müssen, damit du eben die kompletten Wörter hast.

    Aber da kann ich nicht dran mitbauen, sorry.

    @post: Sorry, hatte mich durch das REGEXP im Query darauf bringen lassen...
    Geändert von para_noid (04.11.11 um 16:35 Uhr)
     
    Für die Übereinstimmung von Niederschrift und Hirninhalt.

  6. #6
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    Vielleicht so:

    PHP-Code:
    $string "Banane";
    $pattern '/.*(anan)*/';
    preg_match($pattern$string$matches); 
    edit, sorry so kannst nicht funktionieren. ich habs nur mit dem String "Banane" getestet.

    edit2: so sollte es gehen
    [php]
    PHP-Code:
    $string "Ich bin eine gerade Banane und hab keinen Bogen";
    $pattern '/[^ ]('.$search.')[^ ]/';
    preg_match($pattern$string$matches); 
    Geändert von Maniac (04.11.11 um 16:26 Uhr)
     
    Die Schweine von heute sind unsere Schnitzel von morgen!

  7. #7
    slimox slimox ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    82
    Was hast du denn in $search drin?
    Code :
    1
    
    $search = 'anan';

    Es ist nicht wichtig was in search steht. Ist der Suchbegriff und könnte auch 'Bana' oder so sein

    Ja, die Lösung mit Leerzeichen trennen geht nicht, da das Wort auch am Satzende stehen kann ,.!? Der Text ist HTML-Formatiert also auch <> sind möglich

    Zitat Zitat von Maniac Beitrag anzeigen
    edit2: so sollte es gehen
    [php]
    PHP-Code:
    $string "Ich bin eine gerade Banane und hab keinen Bogen";
    $pattern '/[^ ]('.$search.')[^ ]/';
    preg_match($pattern$string$matches); 
    Wie ist es möglich vor und nach dem Wort ein Leerzeichen und |,|.|?|!|<|>|
    Geändert von sheel (04.11.11 um 16:38 Uhr) Grund: Doppel
     

  8. #8
    Avatar von Maniac
    Maniac Maniac ist offline Mitglied Smaragd
    Registriert seit
    Apr 2007
    Ort
    Augsburg/Gersthofen (Bayern)
    Beiträge
    1.204
    Zitat Zitat von slimox Beitrag anzeigen
    Wie ist es möglich vor und nach dem Wort ein Leerzeichen und |,|.|?|!|<|>|
    http://www.danielfett.de/internet-un...ere-ausdruecke

    Das dürfte ansich aber keine Rolle spielen, ich habs jetzt mehrmals getestet, mit diesem Regex findet er immer Banane, auch wenn ich ein Komma oder sonstiges davor oder danach schreibe.
    Geändert von Maniac (04.11.11 um 16:43 Uhr)
     
    Die Schweine von heute sind unsere Schnitzel von morgen!

  9. #9
    slimox slimox ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    82
    Bei mir findet es auch eine Banane
    Code :
    1
    
    Banane steht für: Bananen (Musa), eine Gattung in der Familie der Bananengewächse! Wo so..
    PHP-Code:
            $pattern '/[^ ]('.$search.')[^ ]/';
            
    preg_match($pattern$row->text1$treffer);
            
    var_dump($treffer); 
    Code :
    1
    
    array(2) { [0]=> string(6) "Banane" [1]=> string(4) "anan" }

    Es sollte aber: Banane, Bananen, Bananengewächse finden. Bin am ReguläreA. am durchlesen
     

  10. #10
    slimox slimox ist offline Mitglied Silber
    Registriert seit
    Mar 2007
    Beiträge
    82
    So, das pattern sieht jetzt so aus
    PHP-Code:
    $pattern =   '/\b([\wöäü]*'.$search.'[\wöäü]*)\b/i'
    ein weiterer Fehler war preg_match( jetz ist preg_match_all( am laufen
    PHP-Code:
    $search 'anan';
    $woerter = array();

    $sql "SELECT
                name, text1,
                IF( name  REGEXP '
    $search', 3, 0 ) AS inName,
                IF( text1  REGEXP '
    $search', 1, 0 ) AS inText1
            FROM
                dbsuche
            WHERE
                name REGEXP '
    $search'
            OR
                text1 REGEXP '
    $search'
            ORDER BY
                (inName + inText1)
            DESC
            LIMIT 10"
    ;

    $query $this->db->query($sql);
    foreach (
    $query->result() as $row){
        
    //Wenn im Namen gefunden
        
    if($row->inName == 3){
            
    //Wenn das Wort noch nicht im Array
            
    if(!in_array($row->name$woerter)) {
                
    $woerter[] = $row->name;
            }
        }
        
        
    //Wenn im Text gefunden
        
    if($row->inText1 == 1){
            
    $pattern =   '/\b([\wöäü]*'.$search.'[\wöäü]*)\b/i';
            
    preg_match_all($pattern$row->text1$treffer);
            
    //Alle Treffer 
            
    foreach($treffer[0] as $value){
                
    //Wenn das Wort noch nicht im Array
                
    if(!in_array($value$woerter)) {
                    
    $woerter[] = $value;
                }
            }
        }


    var_dump($woerter); 
    und es gibt alle möglichen Bananen zurück
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    array(3) {
      [0]=>
      string(6) "Banane"
      [1]=>
      string(7) "Bananen"
      [2]=>
      string(16) "Bananengewächse"
    }
     

Ähnliche Themen

  1. Text wörter ändern
    Von rtky_Trunks im Forum PHP
    Antworten: 2
    Letzter Beitrag: 11.05.05, 14:24
  2. REGEXP - Wörter in einem Text finden
    Von derlippe im Forum Relationale Datenbanksysteme
    Antworten: 5
    Letzter Beitrag: 04.02.05, 16:01
  3. wörter an einem würfel?
    Von neuermensch im Forum Cinema 4D
    Antworten: 5
    Letzter Beitrag: 07.09.04, 18:24
  4. best. Wörter aus Text filtern
    Von BigFacker im Forum PHP
    Antworten: 1
    Letzter Beitrag: 15.10.03, 13:18
  5. Wörter von einem String suchen,.....
    Von Nucleus im Forum PHP
    Antworten: 4
    Letzter Beitrag: 28.03.03, 13:00

Stichworte