2014-09-06 36 views
0

python中是否有函數或包,我可以使用它來編碼字符串,以確保它可以用作CSS string?它需要跳過所有單引號和雙引號和反斜槓,並用\A替換換行符。使用python編碼字符串的CSS方式

例如:

This is "it", isn't\ 
it? 

應轉換爲

This is \"it\", isn't\\\A it? 

非ASCII字符可以原封不動,如果它們被打印成UTF-8。

回答

1

看看規則,所有需要轉義的都是引號(單和雙)和換行符。標準沒有提到它,但是這大概也必須擴展到反斜槓字符(通過檢查MDN on the <string> data type確認)。

正則表達式可以這樣做:

re.sub(r'''['"\n\\]''', lambda m: '\\{:X} '.format(ord(m.group())), inputstring) 

這逸出4個字符爲十六進制逃逸是unambigous; {escape} macro uses the space after the escape to delineate the escape from any content following it。這是最實用的選項;它會產生一個有效的CSS字符串值。

演示:

>>> import re 
>>> inputstring = '''This is "it", isn't\nit?''' 
>>> re.sub(r'''['"\n\\]''', lambda m: '\\{:X} '.format(ord(m.group())), inputstring) 
'This is \\22 it\\22 , isn\\27 t\\A it?' 
>>> print(re.sub(r'''['"\n\\]''', lambda m: '\\{:X} '.format(ord(m.group())), inputstring)) 
This is \22 it\22 , isn\27 t\A it? 
+0

謝謝,我想試試,但要注意的是:(1)不需要十六進制轉義,除了換行。 (2)轉義後必須包含空格,否則以下字符可能被解釋爲十六進制數字的一部分(儘管在本例中不會發生)。 – Jellby 2014-09-06 12:04:41

+0

@Jellby:十六進制轉義是*允許*,並且使用它們使得**更簡單**。這也意味着你不必檢測你是否需要使用'''單引號或'''雙引號。 – 2014-09-06 12:06:32

+0

@Jellby:啊,轉義後的空間實際上並不是內容的一部分,會調整。 – 2014-09-06 12:26:28