zurück zur Startseite
  


Zurück XHTMLforum > Webentwicklung (außer XHTML und CSS) > Serveradministration und serverseitige Scripte
Seite neu laden [PHP] Problem bei Umsetzung eines Lexikons

Antwort
 
LinkBack Themen-Optionen Ansicht
  #1 (permalink)  
Alt 01.09.2006, 15:00
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 29.08.2005
Beiträge: 81
Thies befindet sich auf einem aufstrebenden Ast
Standard [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);
}
Damit werden alle Worte wie Bildungssystem in entsprechende Links wie http://www.domain.de/lex/Bildungssystem umgewandelt.

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
Mit Zitat antworten
Sponsored Links
  #2 (permalink)  
Alt 02.09.2006, 01:12
...
neuer user
 
Registriert seit: 28.08.2006
Beiträge: 49
stefan-r befindet sich auf einem aufstrebenden Ast
Standard

... 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 ...
Mit Zitat antworten
Sponsored Links
  #3 (permalink)  
Alt 04.09.2006, 22:11
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 29.08.2005
Beiträge: 81
Thies befindet sich auf einem aufstrebenden Ast
Standard

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);
Dann kommt der Fehler Compilation failed: unmatched parentheses at offset 5

Alternativ hatte ich probiert

Code:
$check_text6 = preg_replace("/\[lex\](.*?)\[/lex\]/", "$0", $check_text6);
Dann kommt der Fehler Unknown modifier 'l'

Was mache ich falsch?

Danke vorab

Frank-Andre
__________________
Credendo Vides
Mit Zitat antworten
  #4 (permalink)  
Alt 04.09.2006, 22:37
...
neuer user
 
Registriert seit: 28.08.2006
Beiträge: 49
stefan-r befindet sich auf einem aufstrebenden Ast
Standard

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);
Mit Zitat antworten
  #5 (permalink)  
Alt 04.09.2006, 22:51
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 29.08.2005
Beiträge: 81
Thies befindet sich auf einem aufstrebenden Ast
Standard

Danke, das klappt nun.

Was bedeuten denn die Zeichen % und si in dieser regex? Das i steht doch für nicht case-sensitive und das s?

CU

Frank-Andre
__________________
Credendo Vides
Mit Zitat antworten
  #6 (permalink)  
Alt 04.09.2006, 23:42
...
neuer user
 
Registriert seit: 28.08.2006
Beiträge: 49
stefan-r befindet sich auf einem aufstrebenden Ast
Standard

... 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]) ...
Mit Zitat antworten
  #7 (permalink)  
Alt 05.09.2006, 21:12
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 29.08.2005
Beiträge: 81
Thies befindet sich auf einem aufstrebenden Ast
Standard

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);
wobei $i der jeweilige Begriff ist, der ersetzt werden soll. Das klappt auch grundsätzlich gut. Wenn ich aber ermöglichen lassen will, dass manuelle BBCodes erfasst werden können wie [lex="laborum"]labore[/lex], dann wird daraus leider [lex="[lex]laborum[/lex]"]labore[/lex]

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
Mit Zitat antworten
  #8 (permalink)  
Alt 05.09.2006, 22:12
...
neuer user
 
Registriert seit: 28.08.2006
Beiträge: 49
stefan-r befindet sich auf einem aufstrebenden Ast
Standard

... 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 ...
Mit Zitat antworten
  #9 (permalink)  
Alt 05.09.2006, 23:34
Benutzer
neuer user
Thread-Ersteller
 
Registriert seit: 29.08.2005
Beiträge: 81
Thies befindet sich auf einem aufstrebenden Ast
Standard

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;
Das Lexikon ist noch nicht online, daher kann ich noch keinen Link zum Anschauen posten, das Lexikon wird aber in Kürze gestartet und mit Daten gefüllt.

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)
Mit Zitat antworten
Sponsored Links
Antwort


Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Ä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


Alle Zeitangaben in WEZ +2. Es ist jetzt 16:48 Uhr.