Zum Inhalt springen

regex - php lexikon


Empfohlene Beiträge

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 :D

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] :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...