Art Geschrieben 1. Oktober 2002 Teilen Geschrieben 1. Oktober 2002 hi, ich versuche mich gerade an einem lexikon, dazu hat mir ein bekannter seine datenbank zum testen zur verfügung gestellt. für meine funktion bruche ich zwei spalten der tabelle. schlagwort und beschreibung. jetzt ist es so, dass es in jedem lexikon in den beschreibungen der schlagworte verweise zu anderen begriffen gibt. und genau das soll die funktion leisten. sie liest alle schlagworte aus und verlinkt diese dann in den beschreibungen. das wäre ja alles nicht sonderlich kompliziert, wenn die schlagworte eindeutige wortgrenzen hätten. manche begriffe in der datenbank bestehen allerdings aus mehreren worten. jetzt lese ich alle schlagworte beginnden mit dem längsten aus und ersetze deren vorkommen in der beschreibung mit einem link: beispiel: schlagwort: "Steuerung Bauart Heusinger" gefunden in Beschreibung zu Schlagwort: "Gegenkurbel" wird ersetzt zu: "<lex>Steuerung Bauart Heusinger</lex>;" schön und gut. irgendwann kommt aber das schlagwort "Bauart" dran und dann knallt er mir, den link dazwischen: Beispiel: <lex>Steuerung <lex>Bauart</lex> Heusinger</lex> und das soll natürlich vermieden werden. bei manchen meiner versuche klappt es, allerdings werden dann andere sachen wieder nicht ersetzt. bedingung ist, das alle begriffe ersetzt werden müssen, am satzanfang und ende usw. bin ziemlichmit den nerven runter? jemand eine idee? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 1. Oktober 2002 Teilen Geschrieben 1. Oktober 2002 Original geschrieben von Art beispiel: schlagwort: "Steuerung Bauart Heusinger" gefunden in Beschreibung zu Schlagwort: "Gegenkurbel" wird ersetzt zu: "<lex>Steuerung Bauart Heusinger</lex>;" Ähnliches Problem hatte ich mal bei der Implementation von einfachem Syntaxhighlighting. Ich habe einfach die gefundenen Bereiche vorläufig durch Tokens ersetzt und erst nach Abschluss der Suche diese Tokens wieder in die ursprüngliche Textstelle verwandelt. Beispiel: Schlagwort: "Steuerung Bauart Heusinger" Hat in der DB die eindeutige id 237 Wird ersetzt zu ###LEX237### Damit entgeht dieser Text jedem weiteren Replacement. Ist die Schlagwortsuche abgeschlossen wird aus ###LEX[0-9]*### dann "<lex>".$schlagwort[$sid]."</lex>" gemacht. Das ist zwar eine Phase mehr, dafür funktioniert das aber. Mag aber sicher bessere Methoden geben. Hoffe, das war halbwegs verständlich... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Art Geschrieben 1. Oktober 2002 Autor Teilen Geschrieben 1. Oktober 2002 verständlich und interessant. dann brauche ich aber noch einen datenbankdurchlauf mehr oder? und der kram ist schon sooo langsam bei über 800 einträgen kann man sich ausrechnen was da durchlaufen wird. aber werde mich nach dem job mal dransetzen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
DevilDawn Geschrieben 1. Oktober 2002 Teilen Geschrieben 1. Oktober 2002 Ich hab den 2. DB-Durchlauf vermieden indem ich einfach ein lokales Schlagwort-Array beim Parsen gebaut habe. d.h. ich habe mit ###LEXn### nicht die DB-id referenziert, sondern den Index eines lokalen Arrays mit gefundenen Schlagworten. Hängt natürlich von der Anwendung ab welche Methode vernünftiger ist. Ganz extrem: Schon in der Datenbank alle Schlagworte durch Tokens ersetzen Dafür hat man dann aber das gerangel wenn Einträge hinzugefügt oder gelöscht werden... Andererseits ist es für den Anwender dann schneller Nunja war als Ansatz gedacht. Spaß ist, was du daraus machst [tm] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Art Geschrieben 3. Oktober 2002 Autor Teilen Geschrieben 3. Oktober 2002 aber vielleicht läßt es sich noch optimieren. $lexikon = mysql_query("select lexid, item from $prefix"._lexikon." order by length(item) desc"); $num = mysql_num_rows($lexikon); while (list($lexid1, $item1) = mysql_fetch_row($lexikon)){ $lexikon2 = mysql_query("select item, lexid, lexdesc from $prefix"._lexikon." where lexdesc regexp binary '[[:<:]]($item1)[[:>:]]'"); $num = mysql_num_rows($lexikon2); if($num>0){ while (list($item2, $lexid2, $lexdesc2) = mysql_fetch_row($lexikon2)){ if($lexid2 != $lexid1){ $lexdesc2 = preg_replace("/(\b$item1\([^-<])/s", "xxx".$lexid1."xxx\\2", $lexdesc2); $rsUpdate = mysql_query("update $prefix"._lexikon." set lexdesc='$lexdesc2' where lexid='$lexid2'"); } } } } $lexikon2 = mysql_query("select item, lexid, lexdesc from $prefix"._lexikon." order by lexid"); while (list($item2, $lexid2, $lexdesc2) = mysql_fetch_row($lexikon2)){ while (preg_match("/(xxx)(\d+)(xxx)/sU", $lexdesc2, $matches)){ $xTemp = $matches[2]; $lextemp = mysql_query("select lexid, item from $prefix"._lexikon." where lexid='$xTemp'"); list($lexid, $item)=mysql_fetch_row($lextemp); $lexdesc2 = str_replace("xxx" . $xTemp ."xxx", "<img src=\"images/lexikon/lexlink.gif\"><a href=\"modules.php?name=Lexikon&file=index&lex=listItem&item=".$lexid ."\">". $item. "</a>", $lexdesc2); $rsUpdate = mysql_query("update $prefix"._lexikon." set lexdesc='$lexdesc2' where lexid='$lexid2'"); } } [/php] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.