htmlspecialchars(); UBB(); nl2br(); für Python

Code-Stücke können hier veröffentlicht werden.
Antworten
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

Nabend,

Code: Alles auswählen

def htmlspecialchars(string, quote_style="ENT_COMPAT"):
      """string htmlspecialchars ( string string [, int quote_style])
         htmlspecialchars --  Diese Funktion wandelt Sonderzeichen in HTML-Codes um"""

      _ANDCHAR = (r"&", r"&")
      _QUOTES  = (r"\"", r"&")
      _QUOTE   = (r"'", r"'")
      _SMALL   = (r"<", r"&")
      _BIG     = (r">", r"&")

      if quote_style == "ENT_COMPAT":
         list = (_ANDCHAR, _QUOTES, _SMALL, _BIG)
      elif quote_style == "ENT_NOQUOTES":
         list = (_ANDCHAR, _SMALL, _BIG)
      elif quote_style == "ENT_QUOTES":
         list = (_ANDCHAR, _QUOTES, _QUOTE, _SMALL, _BIG)

      for key, char in list:
         regexp = re.compile(key)
         string = regexp.sub(char, string)

      return string

Code: Alles auswählen

def UBB(string):
      e = re.compile("\[b](.+?)\[/b]", re.I|re.S)
      string = e.sub("<b>\\1</b>", string)

      e = re.compile("\[i](.+?)\[/i]", re.I|re.S)
      string = e.sub("<i>\\1</i>", string)

      e = re.compile("\[u](.+?)\[/u]", re.I|re.S)
      string = e.sub("<u>\\1</u>", string)

      e = re.compile("\[quote](.+?)\[/quote]", re.I|re.S)
      string = e.sub("Zitat:<br /> <q>\\1</q>", string)

      e = re.compile("\[quote=(.+?)](.+?)\[/quote]", re.I|re.S)
      string = e.sub("Zitat: \\1 <br /><q cite=\"\\1\">\\2</q>", string)
      
      e = re.compile("\[img](http://.+?(\.jpg|\.JPG|\.jpeg|\.JPEG|\.png|\.PNG|\.gif|\.GIF))\[/img]", re.I|re.S)
      string = e.sub("<img src=\"\\1\"/>", string)

      e = re.compile("\[url=(http://.+?)](.+?)\[/url]", re.I|re.S)
      string = e.sub("<a href=\"\\1\">\\2</a>", string)

      e = re.compile("\[url](http://.+?)\[/url]", re.I|re.S)
      string = e.sub("<a href=\"$1\">\\1</a>", string)

      return string

Code: Alles auswählen

def nl2br(string):
      """string nl2br ( string string)
           Gibt den string mit einem eingefügten '<br />' vor dem Neue-Zeile-Zeichen zurück."""
      _BR       = (r"\n", r"<br />")
      regexp = re.compile(_BR[0])
      string = regexp.sub(_BR[1], string)
      return string
Wenn jemand einen einfachere Lösung hat kann er sie ja posten :)
MfG
Andreas
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi XT@ngel,

mein Vorschlag für nl2br

Code: Alles auswählen

def nl2br(string):
    return string.replace("\n", "<br />\n")
Gruß

Dookie
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Einfacher nicht, allerdings schneller bei wiederholter Anwendung (es wird nicht jedesmal neu compiliert). Außerdem kannst du bei img die großen Dateiendungen streichen, da ja re.I gesetzt ist (fraglich ob überhaupt nach Endungen unterschieden werden muss, gibt ja noch tif und bmp, die ich noch ergänzt habe...):

Code: Alles auswählen

_big=re.compile("\[b](.+?)\[/b]", re.I|re.S)
_kursiv=re.compile("\[i](.+?)\[/i]", re.I|re.S)
_underlined=re.compile("\[u](.+?)\[/u]", re.I|re.S)
_simpel_quote=re.compile("\[quote](.+?)\[/quote]", re.I|re.S)
_author_quote=re.compile("\[quote=(.+?)](.+?)\[/quote]", re.I|re.S)
_image=re.compile("\[img](http://.+?(\.jpg|\.jpeg|\.png|\.gif|\.bmp|\.tif))\[/img]", re.I|re.S)
_named_url=re.compile("\[url=(http://.+?)](.+?)\[/url]", re.I|re.S)
_nameless_url=re.compile("\[url](http://.+?)\[/url]", re.I|re.S)

def UBB(string):
      string = _big.sub("<b>\\1</b>", string)
      string = _kursiv.sub("<i>\\1</i>", string)
      string = _underlined.sub("<u>\\1</u>", string)
      string = _simpel_quote.sub("Zitat:<br /> <q>\\1</q>", string)
      string = _author_quote.sub("Zitat: \\1 <br /><q cite=\"\\1\">\\2</q>", string)
      string = _image.sub("<img src=\"\\1\"/>", string)
      string = _named_url.sub("<a href=\"\\1\">\\2</a>", string)
      string = _nameless_url.sub("<a href=\"\\1\">\\1</a>", string)
      return string
Ansonsten: Hut ab, keine schlechte Leistung! Das man auch Gruppen mit sub wieder einfügen kann wusste ich noch nicht.

Ps: was ist der Unterschied zwischen "$1" und "\\1" bei sub?
Zuletzt geändert von Milan am Donnerstag 6. Mai 2004, 11:01, insgesamt 1-mal geändert.
XT@ngel
User
Beiträge: 255
Registriert: Dienstag 6. August 2002, 14:36
Kontaktdaten:

@Dookie, kommt davon wenn man vor lauter Bäumen den Wald nicht mehr sieht ;-). Danke!

string = _nameless_url.sub("<a href=\"$1\">\\1</a>", string)
Ps: was ist der Unterschied zwischen "$1" und "\\1" bei sub?
Also das dürfte meines meines Wissens nach, so nicht funktionieren *g* (was es aber tut)
Ich schreib gerade wieder ein Projekt in PHP, wird wohl der Grund für diesen Tippfehler sein.

MfG
Andreas
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

Vorweg: Ich habe mich noch GAR NICHT mit der Python Sytax beschäftigt... Deshalb kopiere ich hier die Funktion XT@ngels und erstetze nur die Reg.Exp. (Die hoffentlich in PHP gelich sein sollten):

Code: Alles auswählen

def nl2br(string): 
      """string nl2br ( string string) 
           Gibt den string mit einem eingefügten '<br />' vor dem Neue-Zeile-Zeichen zurück.
           --> Neu: Auch die Macintosh Umbrücke werden beachtet (\r)""" 
      _BR       = (r"(\r\n)|(\r)", r"<br />") 
      regexp = re.compile(_BR[0]) 
      string = regexp.sub(_BR[1], string) 
      return string 
Ich hoffe, dass das so klappt... In PHP nutze ich eigentlich diese Funktion, kann sie nur schwer übertragen:

Code: Alles auswählen

$text = preg_replace("!(\r\n)|(\r)!"," ", $var);
So lösche ich die Zeilenumbrüche zwischen Wörtern und verschwende so nicht meinen Traffic... (http://www.emmaempire.net/)

Deshalb bin ich auch gegen Dookies Vorschlag das "<br />" durch "<br />\n" zu ersetzen...
[quote]"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."[/quote]
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Marvoloe,

wie ich das sehe, ersetzt du die Zeilenumbrüche durch ein Leerzeichen, das spaart nur bei Dateien die von Dos/Windows kommen je Zeilenumbruch ein Zeichen. Dafür ist dann der erzeugte Source kaum mehr lesbar.
Du kannst bei Python auch beim Lesen von Dateien den "universal newline support" aktivieren mit "rU" statt "r" als mode, dann bekommst du bei Zeilenumbrüchen immer "\n" egal ob die Datei von einem Unix, MacOS oder Windows Rechner stammt.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Marvoloe
User
Beiträge: 16
Registriert: Donnerstag 4. November 2004, 20:00
Wohnort: Magdeburg, Sachsen-Anhalt
Kontaktdaten:

Hallo Dookie,

dass ich den Umbruch durch ein Leerzeichen ersetze ist nur ein Teil der Traffic ersprung: Bein Debuggen habe ich einen Source wie diesen hier. Aber generell sprt man bei 3000 Nutzern am Tag durch das Löschen der Einrükungswhitespaces ne menge Traffic... Ist egal... Tut hier nichts zur Sache.)

Dass man bei Python "\n" auf alle anwenden kann wusste ich nicht :oops: Aber ist natürlich cool.
Wollte es nur mal als Anstoß liefern.
[quote]"Für ein Schiff das seinen Hafen nicht kennt ist jeder Wind der Falsche."[/quote]
Antworten