Frage zu regulären Ausdrücken in Wortzensur

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag 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
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag von smaugilein »

Jetzt macht er die w3-Adressen aber wieder mit... :(

[ externes Bild ]
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
MagMo
Ehemaliges Teammitglied
Beiträge: 584
Registriert: 30.10.2005 16:06
Wohnort: Köln
Kontaktdaten:

Beitrag 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
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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...! :roll:
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
alcaeus
Mitglied
Beiträge: 167
Registriert: 10.10.2004 16:14
Wohnort: Dietersheim b. München
Kontaktdaten:

Beitrag 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
Ein Portal für Informatik-Studenten: http://www.infler.de
Meine Homepage: http://www.alcaeus.org
Letzter Artikel: Working with phpBB again
Benutzeravatar
smaugilein
Mitglied
Beiträge: 115
Registriert: 20.01.2005 23:54
Wohnort: Essen
Kontaktdaten:

Beitrag 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.
Wo kann ich denn den Text für die Signatur eintippen? *wunder*
Benutzeravatar
witzigerkiller
Gesperrt
Beiträge: 878
Registriert: 05.02.2005 13:27
Wohnort: Sonthofen

Beitrag 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
Bitte keine Anfragen mehr per PN
When you get me on my nerven I put you in the Gully and do the Deckel drüf and you never will come back to the Tageslicht.
Benutzeravatar
witzigerkiller
Gesperrt
Beiträge: 878
Registriert: 05.02.2005 13:27
Wohnort: Sonthofen

Beitrag 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...
Bitte keine Anfragen mehr per PN
When you get me on my nerven I put you in the Gully and do the Deckel drüf and you never will come back to the Tageslicht.
123teddy321
Mitglied
Beiträge: 290
Registriert: 29.07.2005 17:27
Kontaktdaten:

Beitrag 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!
Benutzeravatar
witzigerkiller
Gesperrt
Beiträge: 878
Registriert: 05.02.2005 13:27
Wohnort: Sonthofen

Beitrag von witzigerkiller »

so, habs eingebaut:

screen:

[ externes Bild ]
Bitte keine Anfragen mehr per PN
When you get me on my nerven I put you in the Gully and do the Deckel drüf and you never will come back to the Tageslicht.
Antworten

Zurück zu „Coding & Technik“