Zur Navigation

PHP Pratchett-Filter

1 Rudy

Zitat von Terry Pratchett
"Multiple exclamation marks are a sure sign of a diseased mind."

"Mehrfache Rufezeichen sind ein sicheres Zeichen für einen kranken Geist."

"And all those exclamation marks, you notice? Five? A sure sign of someone who wears his underpants on his head."

"Und all diese Ausrufezeichen, hast Du die bemerkt? Fünf? Ein sicheres Zeichen für jemanden, der seine Unterhose auf dem Kopf trägt."

Leider ist diese Unart nicht tot zu kriegen, deshalb suche ich einen geeigneten regulären Ausdruck, um dies zu filtern.

Eigenlich recht leicht, wenn die Ausrufe- und Fragezeichen alle hintereinander wären, das Problem dabei ist, auch solchen Konstrukten zu Leibe zu rücken:

was?????!!!!!?????!?????? ?????!???????? ????!????????????!

sollte werden zu

was?!

Edit:

auch das kommt vor:

Hallo!i !i !i !i !i !i !i

Sollte werden zu

Hallo!
Wie mach ich das am besten?

Danke für Tips
Rudy

22.09.2007 19:58 | geändert: 22.09.2007 20:01

2 Jörg

Ich würde versuchen, schrittweise vorzugehen, z.B. als erstes die Leerzeichen entfernen:

$text = preg_replace('/([\?!])[[:space:]]+([\?!])/', '\\1\\2', $text);

... danach sollten gleiche Zeichen zusammengefasst werden..

... abschließend eine solche Zeichenfolge beschränken auf die beginnenden !? oder ?! - vieleicht in etwa so:

$text = preg_replace('/([^\?^!])(\?!|!\?)[\?!]+([^\?^!])/', '\\1\\2\\3', $text);

Naja, so ganz scheint dies noch nicht hinzuhaun :/ - ist aber vielleicht ein Ansatz?

22.09.2007 20:49 | geändert: 22.09.2007 21:00

3 Rudy

Danke für den guten Ansatz, ich dachte mir schon, dass sich das mit einer Expression nicht so leicht lösen lässt.

Meine momentane Funktion liefert schon ganz gute Ergebnisse:

  function pratchett($text) {
    $text = preg_replace('/([\?!])[\s]+([\?!])/', '$1$2', $text); // 1
    $text = preg_replace('/!1+/', '!', $text); // 2
    $text = preg_replace('/\?[ß\/]+/', '?', $text); // 3
    $text = preg_replace('/\?[\']{2,}/', '?\'', $text); //4
    $text = preg_replace('/\?+/', '?', $text); // 5
    $text = preg_replace('/\!+/', '!', $text); // 6
    $text = preg_replace('/(\?\')+/', '?\'', $text); //7
    $text = preg_replace('/(\?!)+|(!\?)+/', '?!', $text); //8
    return $text;
  }

1) Filtert die Leerzeichen heraus
2) ersetzt die zu schnell ausgelassenen Shifts beim Ausrufezeichen !!!!!!!!!!!!!!!!!!1111
3) ersetzt die zu schnell ausgelassenen Shifts beim Fragezeichen, deutsche und englische ???????????ßßß und ?????????///// Tastaturbelegung
4) ersetzt die zu schnell ausgelassenen Shifts beim Fragezeichen für die Italienische Tastatur, ist heikler, da es das Apostroph ist
5) und 6) ersetzen die mehrfachen ? und !
7) ersetzt für italienische Tastatur die mehrfachen ?', wenn jemand sowas getippt hat: ?'''??????' und es gefiltert zu ?'?' wurde
8) ersetzt ?!?!?!?! und !?!?!?! durch ?!

Sowas
was?????!!!!!!!!!!!1111111111?''''????''?????????????ß
was 2!?!!!!!!! 1!

er sagte: 'was?''

war seine Frage: 'was?'??????!!

wird zu
was?!?'?
was 2?!! 1!

er sagte: 'was?'

war seine Frage: 'was?'?!

Recht gut... warum das fett markierte ! (sieht man nicht gut) noch da ist muss ich noch schaun, seh ich heute nicht mehr :)

23.09.2007 02:10 | geändert: 23.09.2007 02:11

Beitrag schreiben (als Gast)

Beim Verfassen des Beitrages bitte die Forenregeln beachten.





[BBCode-Hilfe]