|
|||
[PHP] Problem bei Umsetzung eines Lexikons
Hallo,
ich brauche mal Euren Rat, vielleicht hat jemand Vorschläge, wie ich meine Idee (besser) umsetzen kann. Im Rahmen der Erweiterung eines CMS arbeite ich an der Integration eines Lexikons. Das klappt auch alles soweit ganz gut. Als eine Option will ich eine automatische Verlinkung der Texte zu anderen Einträge erreichen. Also wenn z.B. in einem Text das Wort Bildungssystem vorkommt und das Wort Bildungssystem ein Begriff des Lexikons ist, dann soll automatisch zum Begriff Bildungssystem verlinkt werden. Das könnte man theoretsich erreichen, dass nach der Erfassung eines Eintrages der Text sofort geprüft wird. Hat aber den Nachteil, dass bisherige Einträge nicht geprüft werden, ob dort im Text der neue Eintrag auch vorkommt. Und on-the-fly nach der Erfassung eines Eintrages alle Einträge zu prüfen, dürfte den Server je nach Anzahl der Einträge ganz schön schaffen Also will ich wie folgt umsetzen: Einmal in der Nacht wird per CronJob das Lexikon deaktiviert und alle Einträge geprüft. Danach wird das Lexikon wieder aktiviert. Zur Umsetzung nutze ich einen BBCode [lex]...[/lex] Das bekomme ich auch hin. Die Idee ist, alle [lex] und [/lex] eines Textes zu löschen und danach per str_replace die Begriffe durchlaufen zu lassen, z.B. per Code:
foreach ($words as $i) { str_replace("/($i)/", " [lex]$i[/lex] ", $string); } Worte wie Bildungssysteme werden davon aber nicht erfasst, also will ich das der Erfasser in solchen Fälle doch manuell einen BBCode erfassen kann: [lex="Bildungssystem"]Bildungssysteme[/lex] Bei der Löschroutine würde aber das schliessende [/lex] gelöscht werden. Und jetzt weiss ich nicht mehr, wie ich das sinnvoll umsetzen kann. Hat jemand von Euch eine Idee oder einen besseren Umsetzungsvorschlag? Danke im Voraus Frank-Andre Thies
__________________
Credendo Vides |
Sponsored Links |
|
|||
... also erstens würd ich dir raten für solche string prüfungen regex funktionen zu verwenden (http://at.php.net/preg_replace), da str_replace nicht das nötige bietet für solche fälle (bsp schon: groß-klein-schreibung) ...
zweitens würd ich das auto verlinken generell lassen ... entweder dein lexikon ist extrem groß, was dann den sever sehr beanspruchen würde alle erdenklichen fälle durchzulaufen oder es ist klein und den aufwand sowieso nicht wert ... wird es nur manuell machen, ist am besten da du die links setzen kannst wie du willst (mehrzahl, wortausschnitt, usw.) ... ist ja bei wikimedia auch so ... |
Sponsored Links |
|
|||
Das mit dem Autoverlinken soll ein zusätzliches Feature werden, da am CMS immer wieder auch Leute arbeiten, die wenig Ahnung von BBCodes etc haben und somit eine Art Basisverlinkung erfolgt.
An den RegEx arbeite ich aktuell, es klappt aber nicht so ganz. Ziel ist es, dass [lex]...[/lex] in ... umgewandelt wird. Code:
$check_text6 = preg_replace("([ (>])(.*?)([ )<,\.])", "$0", $check_text6); Alternativ hatte ich probiert Code:
$check_text6 = preg_replace("/\[lex\](.*?)\[/lex\]/", "$0", $check_text6); Was mache ich falsch? Danke vorab Frank-Andre
__________________
Credendo Vides |
|
|||
der 2. schnipsel müsste schon funktionieren ... allerdings escapest du den delimiter nicht (/) und php sieht dann "l" als modifier an, den es nicht gibt ... du kannst in solchen fällig ruhig großzügig escapen wenn du dir zb nicht sicher bist und vll auch einen anderen delimiter nehmen ...
Code:
$check_text6 = preg_replace('%\[lex\](.*?)\[\/lex\]%si', '\1', $check_text6); |
|
|||
... das "%" ist ein delimiter, das selbe wie "/", du könntest auch zb noch "°" verwenden, ganz egal, bewirken alle das gleche und dienen nur der übersichtlichkeit ... modifier "i" bedeutet das ganze ist case-insensitive (also groß klein außer acht gelassen) ... "s" ist dafür um mit dem punkt character auch neue zeilen mit einzuschließen ... ohne diesen wird beispielsweise eine bbcode der über 2 zeilen läuft nicht geparsed ([lex]eintrag \n neue zeile[/lex]) ...
|
|
|||
Danke, wieder was dazu gelernt.
Jetzt komme ich an einer anderen Stelle nicht weiter und weiss gar nicht, wie man das realisieren kann. Ich ersetze die Begriffe in den Texten per Code:
$check_text5 = preg_replace("/(\b$i\b)/", "[lex]".$i."[/lex]", $check_text5); Ich muss also angeben, dass kein [lex=.....] vorab und kein [/lex] nach dem (\b$i\b) stehen dürfen. Kann mir jemand erklären, wie man solche "Negierungen" erreichen kann? Danke Frank-Andre
__________________
Credendo Vides |
|
|||
... und wie soll das ganze dann ablaufen wenn du den suchbegriff per $i übergibst?! ... also ich kann mir das ganze mal als ziemliche sever beanspruchung vorstellen ... zeig vll mal bisschen mehr von deinem code, dann kann man schauen wo man eventuell was machen kann wenn du das unbedingt umsetzen willst ...
ich würd das ganze so aufbauen ... zuerst alle entries (die id/namen) auslesen ... in ein array damit (eventuell noch in einer datei temporär speichern solange die db unverändert bleibt) ... dann würd ich dir raten zb nur wörter mit mindesten 4 buchstaben oder sogar mehr (eventuell kürzeste länge eines eintrags) ... dann eine liste mit auszuschließenden wörtern anlegen (bsp: haus) ... usw ... solltest du auf jeden fall optimieren das ganze ... nicht einfach so alles parsen was dir so über den weg läuft ... |
|
|||
Dass der Server beansprucht wird, ist mir klar. Daher soll das ganze per CronJob gegen 03:00 Uhr nachts erfolgen und solange das Lexikon automatisch für Besucher deaktiviert werden.
Die Variable $i wird aus der DB ausgelesen und beinhaltet alle erfassten Begriffe des Lexikons. Da dort keine Wörter wie der, Haus etc. vorkommen, muss ich keine auszuschliessende Wörter festlegen. Es geht um Begriffe wie Bildung, Arbeitsmarkt, PKW-Maut, EU-Verfassung etc. Bisher teste ich mit Testbegriffen, bis ich die grundlegende Struktur stehen habe, also z.B.: Code:
$check_text = 'Lorems lorem ipsum dolor sit amet, [lex]consectetur[/lex] adipisicing elit, sed do eiusmod tempor incididunt ut [lex=laborum]labore[/lex] et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est [lex="laborum"]laborum[/lex]. '; $words = array('lorem', 'consectetur', 'laborum'); $check_text = preg_replace('%\[lex\](.*?)\[\/lex\]%si', '\1', $check_text); foreach ($words as $i) { $check_text = preg_replace("/($i)/", "[lex]".$i."[/lex]", $check_text); } echo $check_text; Der CronJob wird erst in einer zweiten Version eingebaut, so dass ich noch etwas Zeit habe, mir eine sinnvolle Struktur zu überlegen. CU Frank-Andre
__________________
Credendo Vides Geändert von Thies (05.09.2006 um 23:37 Uhr) |
Sponsored Links |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Problem mit Text neben Navigationsleiste | andi01 | CSS | 6 | 08.06.2011 16:54 |
Mitwachsender Content und Footer Problem | Bentham | CSS | 5 | 19.09.2010 11:49 |
IE 7: Zoom Problem, Höhen Problem, Text problem | Cu Chullain | CSS | 4 | 02.09.2010 13:56 |
PNG in IE Problem mit der Mauserkennung (klickbar oder nicht) | Angélique | CSS | 13 | 16.03.2010 18:20 |
[PHP] Bildergalerie Problem | SPMan | Serveradministration und serverseitige Scripte | 11 | 17.12.2006 13:04 |