Seite 2 von 3
Verfasst: 11.02.2006 13:41
von MagMo
Hi,
ach so war das gemeint. Folgendes sollte das Problem lösen:
Code: Alles auswählen
$orig_word[] = '#\b([^/.]*?)' . $row['word'] . '(.*?)\b#i';
Ich hoffe ich habe da jetzt keine Gedankenfehler gemacht.
\b besagt, dass es sich beim Wortanfang die Prüfung beginnt. ([^/.])*? dann dürfen (müssen aber nicht) beliebig viele Zeichen folgen, aber kein Slash und kein Punkt. Dann kommt der "Zensurbegriff". Dann können bis zum Wortende \b beliebige Zeichen .*? (es wird nicht mehr auf Punkt und Slash überprüft) beliebig oft folgen (müssen aber nicht).
Dann musst du aber auch den Replacement-Ausdruck ändern:
Code: Alles auswählen
$replacement_word[] = '\\1<acronym title="' . $row['replacement'] . '" style="border-bottom:1px dotted #cc0000;padding:0px">' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '</acronym>\\2';
Grüße
MagMo
Verfasst: 11.02.2006 13:48
von smaugilein
Jetzt macht er die w3-Adressen aber wieder mit...
[ externes Bild ]
Verfasst: 11.02.2006 15:08
von MagMo
Hi,
smaugilein hat geschrieben:Jetzt macht er die w3-Adressen aber wieder mit...

Ich hatte vergessen, dass der Punkt als Wortgrenze gilt. Daher funktioniert obiges nicht so ganz.
Teste mal folgendes:
Code: Alles auswählen
$orig_word[] = '#(\A|\s)([^/.]*?)' . $row['word'] . '(.*?)(\s|\z)#i';
$replacement_word[] = '\\1\\2<acronym title="' . $row['replacement'] . '" style="border-bottom:1px dotted #cc0000;padding:0px">' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '</acronym>\\3\\4';
Hoffe das funktioniert.
Grüße
MagMo
Verfasst: 11.02.2006 18:40
von smaugilein
Danke für die viele Hilfe! Und: Sag Bescheid, wenn ich nerve!
Jetzt funktioniert's bis auf folgenden Fall:
Hinter dem Wort kommen noch andere Zeichen (z.B. bei "Avatar" noch das Plural "e", also "Avatare"). Dann wird's nicht mehr erkannt. Bei "Pavatare" hingegen schon.
Irgendeinen letzten Tipp noch? Zur Not kann ich auf Buchstaben vor dem Suchwort verzichten, hauptsache, bspw. "Avatare" wird erkannt...!

Verfasst: 11.02.2006 20:01
von alcaeus
Moin,
du solltest beachten, dass die Wortzensur fuer den Beitragstext etwas anders funktioniert, als fuer den Titel. Hier mal fuer den Titel:
Code: Alles auswählen
$post_subject = preg_replace($orig_word, $replacement_word, $post_subject);
und hier fuer den Text:
Code: Alles auswählen
$message = str_replace('\"', '"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1));
Genau dieses ganze gefriemle verhindert, dass Texte in URLs ersetzt werden; bzw. dass Texte in Tags ersetzt werden.
Irgendwo hier muesste ich auch noch eine Funktion rumliegen haben, die genau das macht; sie spaltet den Beitrag ueber preg_split() auf und ueberprueft, wo ersetzt werden darf und wo nicht. Eventuell kann ich die ja mal raussuchen.
Greetz
alcaeus
Verfasst: 11.02.2006 20:25
von smaugilein
Unfassbar! Jetzt funktioniert's! Hab's in die viewtopic eingebaut und es klappt!
Danke euch beiden!!
[ externes Bild ]
-------------------------
Für alle Interessierten hier die Zusammenfassung, um aus der Wortzensur eine Worterklärung zu machen:
Suche in der includes/functions.php nach
Code: Alles auswählen
$orig_word[] = '#\b(' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . ')\b#i';
$replacement_word[] = $row['replacement'];
Ersetze es durch
Code: Alles auswählen
$orig_word[] = '#(\A|\s)([^/.]*?)' . $row['word'] . '(.*?)(\s|\z)#i';
$replacement_word[] = '\\1\\2<acronym title="' . $row['replacement'] . '" style="border-bottom:1px dotted #cc0000;padding:0px">' . str_replace('\*', '\w*?', phpbb_preg_quote($row['word'], '#')) . '</acronym>\\3\\4';
Suche in der viewtopic.php nach
Code: Alles auswählen
$message = preg_replace($orig_word, $replacement_word, $message);
und
ersetze es durch
Code: Alles auswählen
$message = str_replace('\"', '"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1));
Fertig!
Erkannte Wörter werden rot gestrichelt unterstrichen dargestellt und der Erklärungstext erscheint beim Draufhalten des Mauszeigers!
Tipp: Optional kann man noch ";cursor:help" (ohne Anführungsstriche) hinter "padding:0px" (ohne Anführungsstriche) setzen, damit der Mauszeiger zu einem Hilfe-Mauszeiger wird, wenn man diesen über das Wort hält.
Verfasst: 11.02.2006 21:12
von witzigerkiller
ehm:
Suche in der viewtopic.php nach
Code:
$message = preg_replace($orig_word, $replacement_word, $message);
das gibts bei mir net.... bei mir gibts das hier, was das einzige mit $message = preg_replace ist
Code: Alles auswählen
if ( $postrow[$i]['enable_html'] )
{
$message = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $message);
}
Danke
Verfasst: 11.02.2006 21:19
von witzigerkiller
kannste vllt nen größeren auszug geben, damit ich das vllt finde, also bei mir gibts das irgendwie net
Das alles $message = preg_replace($orig_word, $replacement_word, $message);
gibts nur in den dateien:
search.php
madcp.php
und topic_review
und immer nur 1mal, aber nicht in der viewtopic...
Verfasst: 12.02.2006 11:20
von 123teddy321
öhm ich glaube du hast da was verwechselt!
und zwar: das erste suchen und ersetzen stimmt, aber beim zweiten muss es genau anders herum sein, also so:
suche:
Code: Alles auswählen
$message = str_replace('\"', '"', substr(@preg_replace('#(\>(((?>([^><]+|(?R)))*)\<))#se', "@preg_replace(\$orig_word, \$replacement_word, '\\0')", '>' . $message . '<'), 1, -1));
erstetze durch
Code: Alles auswählen
$message = preg_replace($orig_word, $replacement_word, $message);
bitte schön so isses richtig!
Verfasst: 12.02.2006 11:56
von witzigerkiller
so, habs eingebaut:
screen:
[ externes Bild ]