ERLEDIGT
JA
JA
ANTWORTEN
9
9
ZUGRIFFE
458
458
EMPFEHLEN
-
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
In der VAR $row->text1 ist der ganze Text. Wie bekomme ich nur die Wörter in denen auch der Suchstring passt?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;
}
}

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
-
http://docs.jquery.com/Plugins/autocomplete
schau mal hier =)
-
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 hiernicht ein OR stehen?Code sql:1 2 3 4
WHERE name REGEXP '$search' AND text1 REGEXP '$search'
Geändert von para_noid (04.11.11 um 15:45 Uhr)
Für die Übereinstimmung von Niederschrift und Hirninhalt.
-
Das mit jQuery ist nit mein Probhttp://docs.jquery.com/Plugins/autocomplete
schau mal hier =)
Doch da müsste ein OR sein! Sonst ist die Trefferquote sehr schlechtmüsste hier nicht ein OR stehen?
Wie sollte das pattern aussehen?
Ein Beispiel:
Hast du eine Idee?PHP-Code:$needle = 'anan';
$text = 'Eine gerade Banane, nein!';
//Das sollte es finden
array('Banane')
-
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.
-
04.11.11 16:14 #6
Vielleicht so:
edit, sorry so kannst nicht funktionieren. ich habs nur mit dem String "Banane" getestet.PHP-Code:$string = "Banane";
$pattern = '/.*(anan)*/';
preg_match($pattern, $string, $matches);
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!
-
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

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
-
04.11.11 16:34 #8
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!
-
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
-
So, das pattern sieht jetzt so aus
ein weiterer Fehler war preg_match( jetz ist preg_match_all( am laufenPHP-Code:$pattern = '/\b([\wöäü]*'.$search.'[\wöäü]*)\b/i';
und es gibt alle möglichen Bananen zurückPHP-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);
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
-
Text wörter ändern
Von rtky_Trunks im Forum PHPAntworten: 2Letzter Beitrag: 11.05.05, 14:24 -
REGEXP - Wörter in einem Text finden
Von derlippe im Forum Relationale DatenbanksystemeAntworten: 5Letzter Beitrag: 04.02.05, 16:01 -
wörter an einem würfel?
Von neuermensch im Forum Cinema 4DAntworten: 5Letzter Beitrag: 07.09.04, 18:24 -
best. Wörter aus Text filtern
Von BigFacker im Forum PHPAntworten: 1Letzter Beitrag: 15.10.03, 13:18 -
Wörter von einem String suchen,.....
Von Nucleus im Forum PHPAntworten: 4Letzter Beitrag: 28.03.03, 13:00





Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren