string_helper.py是字符串操做包,主要對字符串進行檢查、過濾和截取等處理。html
1 #!/usr/bin/evn python 2 # coding=utf-8 3 4 import re 5 6 7 def check_string(text, pattern): 8 """ 9 檢查字符串是否符合指定規則 10 :param text: 須要檢查的字符串 11 :param pattern: 正式表達式,如:'^[a-zA-Z]+$' 12 :return: 含有指定字符時返回真,不然爲假 13 """ 14 match = re.search(pattern, text) 15 if match: 16 return True 17 else: 18 return False 19 20 21 def is_email(text): 22 """ 23 驗證字符串是不是email 24 :param text: 須要檢查的字符串 25 :return: 符合返回True,不符合返回False 26 """ 27 return check_string(text, '[^\._-][\w\.-]+@(?:[A-Za-z0-9]+\.)+[A-Za-z]+$') 28 29 30 def is_phone(text): 31 """ 32 驗證字符串是不是固定電話 33 :param text: 須要檢查的字符串 34 :return: 符合返回True,不符合返回False 35 """ 36 return check_string(text, '\(?0\d{2,3}[) -]?\d{7,8}$') 37 38 39 def is_mobile(text): 40 """ 41 驗證字符串是不是手機號碼 42 :param text: 須要檢查的字符串 43 :return: 符合返回True,不符合返回False 44 """ 45 return check_string(text, '^1[3578]\d{9}$|^147\d{8}$') 46 47 48 def is_letters(text): 49 """ 50 驗證字符串是否全是字母 51 :param text: 須要檢查的字符串 52 :return: 符合返回True,不符合返回False 53 """ 54 return check_string(text, '^[a-zA-Z]+$') 55 56 57 def is_idcard(text): 58 """ 59 驗證字符串是不是身份證號碼 60 :param text: 須要檢查的字符串 61 :return: 格式正確返回True,錯誤返回False 62 """ 63 ic = IdentityCard() 64 return ic.check(text.upper()) 65 66 67 def filter_str(text, filter='\||<|>|&|%|~|\^|;|\''): 68 """ 69 濾掉字符串 70 :param text: 須要過濾的字符串 71 :param filter: 過濾內容(正則表達式) 72 :return: 去除特殊字符後的字符串 73 """ 74 if text: 75 return re.subn(filter, '', text)[0] 76 else: 77 return '' 78 79 def filter_tags(htmlstr): 80 """ 81 過濾HTML中的標籤 82 :param htmlstr: 要過濾的內容 83 :return: 84 """ 85 re_cdata=re.compile('//<!\[CDATA\[[^>]*//\]\]>',re.I) #匹配CDATA 86 re_script=re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I)#Script 87 re_style=re.compile('<\s*style[^>]*>[^<]*<\s*/\s*style\s*>',re.I)#style 88 re_br=re.compile('<br\s*?/?>')#處理換行 89 re_h=re.compile('</?\w+[^>]*>')#HTML標籤 90 re_comment=re.compile('<!--[^>]*-->')#HTML註釋 91 s=re_cdata.sub('',htmlstr)#去掉CDATA 92 s=re_script.sub('',s) #去掉SCRIPT 93 s=re_style.sub('',s)#去掉style 94 s=re_br.sub('\n',s)#將br轉換爲換行 95 s=re_h.sub('',s) #去掉HTML 標籤 96 s=re_comment.sub('',s)#去掉HTML註釋 97 #去掉多餘的空行 98 blank_line=re.compile('\n+') 99 s=blank_line.sub('\n',s) 100 s=replaceCharEntity(s)#替換實體 101 return s 102 103 def replaceCharEntity(htmlstr): 104 """ 105 替換經常使用HTML字符 106 :param htmlstr: 要替換的字符 107 :return: 108 """ 109 CHAR_ENTITIES={'nbsp':' ','160':' ', 110 'lt':'<','60':'<', 111 'gt':'>','62':'>', 112 'amp':'&','38':'&', 113 'quot':'"','34':'"',} 114 re_charEntity=re.compile(r'&#?(?P<name>\w+);') 115 sz=re_charEntity.search(htmlstr) 116 while sz: 117 entity=sz.group()#entity全稱,如> 118 key=sz.group('name')#去除&;後entity,如>爲gt 119 try: 120 htmlstr=re_charEntity.sub(CHAR_ENTITIES[key],htmlstr,1) 121 sz=re_charEntity.search(htmlstr) 122 except KeyError: 123 #以空串代替 124 htmlstr=re_charEntity.sub('',htmlstr,1) 125 sz=re_charEntity.search(htmlstr) 126 return htmlstr 127 128 129 def string(text, is_return_null=False): 130 """ 131 sql字符串拼接專用函數 132 會在字符串兩邊添加'單撇號,用於生成數據庫sql語句 133 :param text: 須要添加'的字符串 134 :param is_return_null: 是否返回null,是的話在字符串爲空時返回null,不然返回'' 135 :return: 136 """ 137 if not text is None and text != '': 138 return "'" + str(text) + "'" 139 elif not is_return_null: 140 return "''" 141 else: 142 return "null" 143 144 145 def cut_str(text, length): 146 """ 147 將字符串截取指定長度 148 :param text: 須要進行截取的字符串 149 :param length: 字符串保留的長度 150 :return: 151 """ 152 if not text or not isinstance(text, str): 153 return text 154 tem = '' 155 try: 156 tem = text.decode('utf8') 157 except: 158 pass 159 if not tem or tem == '': 160 try: 161 tem = text[0:length] 162 except: 163 tem = text 164 return tem[0:length] 165 166 167 class IdentityCard: 168 """身份證號碼驗證類""" 169 170 def __init__(self): 171 self.__Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] 172 self.__Ti = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] 173 174 def calculate(self, code): 175 """計算校驗位""" 176 sum = 0 177 for i in range(17): 178 sum += int(code[i]) * self.__Wi[i] 179 return self.__Ti[sum % 11] 180 181 def check(self, code): 182 """檢查輸入的號碼是否正確""" 183 184 if (len(code) != 18): 185 return False 186 if self.calculate(code) != code[17]: 187 return False 188 189 return True
check_string()函數主要是用來檢查字符串是否符合指定規則用的,它被is_開頭的各個函數所調用。is_開頭的幾個函數怎麼使用,請看測試用例。前端
#!/usr/bin/evn python # coding=utf-8 import unittest from common import string_helper class StringHelperTest(unittest.TestCase): """字符串操做包測試類""" def setUp(self): """初始化測試環境""" print('------ini------') def tearDown(self): """清理測試環境""" print('------clear------') def test_is_email(self): self.assertEqual(string_helper.is_email('aaaaa'), False) self.assertEqual(string_helper.is_email('aaaa@xxx.com'), True) self.assertEqual(string_helper.is_email('xxx@xxx.com.xx'), True) def test_is_phone(self): self.assertEqual(string_helper.is_phone('aaaaa'), False) self.assertEqual(string_helper.is_phone('12345678'), False) self.assertEqual(string_helper.is_phone('01012345678'), True) self.assertEqual(string_helper.is_phone('010-123456'), False) self.assertEqual(string_helper.is_phone('010-12345678'), True) self.assertEqual(string_helper.is_phone('010 12345678'), True) self.assertEqual(string_helper.is_phone('0757 12345678'), True) def test_is_mobile(self): self.assertEqual(string_helper.is_mobile('aaaaa'), False) self.assertEqual(string_helper.is_mobile('123456789'), False) self.assertEqual(string_helper.is_mobile('13012345678'), True) self.assertEqual(string_helper.is_mobile('14012345678'), False) def test_is_letters(self): self.assertEqual(string_helper.is_letters('123456'), False) self.assertEqual(string_helper.is_letters('1ds2f12sdf'), False) self.assertEqual(string_helper.is_letters('absbdsf'), True) self.assertEqual(string_helper.is_letters('ADdfFSds'), True) def test_is_idcard(self): self.assertEqual(string_helper.is_idcard('123456789'), False) self.assertEqual(string_helper.is_idcard('aaaaaaaaa'), False) self.assertEqual(string_helper.is_idcard('340223190008210470'), False) self.assertEqual(string_helper.is_idcard('34022319000821047X'), True) if __name__ == '__main__': unittest.main()
filter_str()函數用來將指定的特殊字符所有過濾掉python
def test_filter_str(self): print(string_helper.filter_str('aaa')) print(string_helper.filter_str('aaa<>&\'')) print(string_helper.filter_str('aaa<|>|&|%|~|^|;|\''))
執行結果:web
------ini------
aaa
aaa
aaa
------clear------
filter_tags函數將代碼上的所有html標籤過濾掉(網上找到來的代碼)正則表達式
def test_filter_tags(self): print(string_helper.filter_tags('<html><body><b>aaa</b></body></html>'))
執行結果:sql
------ini------
aaa
------clear------
string()函數主要用於拼接sql語句用的,用於在字符串的兩邊添加 ' 這個單撇號,若是is_return_null這個參數爲True時,輸入內容爲空則返回null字符數據庫
def test_string(self): print(string_helper.string(-1)) print(string_helper.string({'test': 'abc'})) print(string_helper.string('')) print(string_helper.string('aaa')) print(string_helper.string('', True))
執行結果:(使用print打印到控制檯的結果,字符串不輸出""雙引號,實際上存儲到變量中時,下面內容都會加上雙引號)json
------ini------ '-1' '{'test': 'abc'}' '' 'aaa' null ------clear------
cut_str()函數會將輸入的字符串按指定長度截取session
def test_cut_str(self): print(string_helper.cut_str('', 5)) print(string_helper.cut_str('aaa', 5)) print(string_helper.cut_str('將字符串截取指定長度', 5)) print(string_helper.cut_str('aa將字符串截取指定長度', 5))
執行結果:ide
------ini------
aaa
將字符串截
aa將字符
------clear------
verify_helper.py是驗證碼生成包,調用比較簡單,這裏就再也不詳細說明,到後面章節會有詳細例子。
web_helper.py是web操做包,主要是對web服務進行相關處理。它須要啓動web服務後基於web服務下才行進行測試操做,不能直接運行測試用例進行測試,你們能夠先了解一下里面函數的功能。
1 #!/usr/bin/evn python 2 # coding=utf-8 3 4 import json 5 import re 6 import urllib.parse 7 from bottle import response, HTTPResponse, request 8 from common import json_helper 9 10 11 def get_ip(): 12 """獲取當前客戶端ip""" 13 try: 14 ip = request.remote_addr 15 except: 16 ip = '' 17 if not ip: 18 try: 19 ip = request.environ.get('REMOTE_ADDR') 20 except: 21 pass 22 return ip 23 24 25 def get_session(): 26 """獲取當前用戶session""" 27 return request.environ.get('beaker.session') 28 29 30 def return_msg(state, msg, data={}): 31 """ 32 接口輸出數據到客戶端 33 :param state: 狀態碼(公共參數,-1=出錯,0=正常) 34 :param msg: 說明信息(公共參數) 35 :param data: 數據字典 36 :return: 返回組合後的json字符串 37 """ 38 msg = { 39 "state": state, 40 "msg": msg, 41 "data": data 42 } 43 # 將字典轉爲字符串輸出 44 message = json.dumps(msg, cls=json_helper.CJsonEncoder) 45 return message 46 47 48 def return_raise(msg=''): 49 """ 50 直接終止程序,返回結果給客戶端 51 修改bottle的異常狀態碼和異常返回body內容 52 :param msg: 輸出內容 53 :return: 輸出字符串 54 """ 55 res = response.copy(cls=HTTPResponse) 56 res.status = 200 57 res.body = str(msg) 58 raise res 59 60 61 def get_form(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True): 62 """ 63 獲取客戶端Form方式提交的參數值 64 :param args_name: 參數名 65 :param msg: 參數中文名稱 66 :param is_strip: 字符串兩端是否自動去除空格 67 :param lenght: 參數長度最大限制,0爲不限制 68 :param is_check_null: 是否要求進行非空檢測,True:當參數值爲空時,返回錯誤提示客戶端不能爲空 69 :param notify_msg: 非必填項,當參數值爲空時,默認返回「xxx 不容許爲空」這個提示,若是這個變量有值,則直接返回這個變量值,即定製好的錯誤提示 70 :param is_check_special_char: 判斷參數值是否含有特殊字符,True=默認會對特殊字符進行判斷,False=不作判斷處理,須要手動對接收參數值進行過濾處理,去除危險字符 71 :return: 返回處理後的參數 72 """ 73 args_value = '' 74 if request.method.upper() in ('POST', 'PUT', 'DELETE'): 75 try: 76 if request.json: 77 args_value = str(request.json.get(args_name, '')).strip() 78 else: 79 args_value = str(request.forms.get(args_name, '')).strip() 80 except: 81 args_value = str(request.forms.get(args_name, '')).strip() 82 if not args_value: 83 args_value = str(request.POST.get(args_name, '')).strip() 84 85 return __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char) 86 87 88 def get_query(args_name, msg, is_strip=True, lenght=0, is_check_null=True, notify_msg='', is_check_special_char=True): 89 """ 90 獲取客戶端Get方式提交的參數值 91 :param args_name: 參數名 92 :param msg: 參數中文名稱 93 :param is_strip: 字符串兩端是否自動去除空格 94 :param lenght: 參數長度最大限制,0爲不限制 95 :param is_check_null: 是否要求進行非空檢測,True:當參數值爲空時,返回錯誤提示客戶端不能爲空 96 :param notify_msg: 非必填項,當參數值爲空時,默認返回「xxx 不容許爲空」這個提示,若是這個變量有值,則直接返回這個變量值,即定製好的錯誤提示 97 :param is_check_special_char: 判斷參數值是否含有特殊字符,True=默認會對特殊字符進行判斷,False=不作判斷處理,須要手動對接收參數值進行過濾處理,去除危險字符 98 :return: 返回處理後的參數 99 """ 100 return __request_handle(__get(args_name), msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char) 101 102 103 def __get(args_name): 104 """ 105 從get請求中提取請求值(直接使用python的GET獲取參數時,有時轉換編碼時會出現亂碼,因此仍是直接採用截取後直接轉碼比較好) 106 例如:http://127.0.0.1:81/manage/manager/?page=0&rows=20&sidx=id&sord=desc&name=%E5%BC%A0%E4%B8%89 107 :param args_name: 要取值的參數名:name 108 :return: 截取的編碼值:%E5%BC%A0%E4%B8%89 109 """ 110 get = '?' + request.query_string 111 start_index = get.find('&' + args_name + '=') 112 if start_index == -1: 113 start_index = get.find('?' + args_name + '=') 114 if start_index == -1: 115 return '' 116 end_index = get.find('&', start_index + 1) 117 if end_index == -1: 118 return get[start_index + len(args_name + '=') + 1:] 119 else: 120 return get[start_index + len(args_name + '=') + 1:end_index] 121 122 123 def __request_handle(args_value, msg, is_strip, lenght, is_check_null, notify_msg, is_check_special_char): 124 """ 125 對客戶端提交的參數進行各類判斷與處理 126 :param args_value: 參數值 127 :param msg: 參數中文名稱 128 :param is_strip: 字符串兩端是否自動去除空格 129 :param lenght: 參數長度最大限制,0爲不限制 130 :param is_check_null: 是否要求進行非空檢測,True:當參數值爲空時,返回錯誤提示客戶端不能爲空 131 :param notify_msg: 非必填項,當參數值爲空時,默認返回「xxx 不容許爲空」這個提示,若是這個變量有值,則直接返回這個變量值,即定製好的錯誤提示 132 :param is_check_special_char: 判斷參數值是否含有特殊字符,True=默認會對特殊字符進行判斷,False=不作判斷處理,須要手動對接收參數值進行過濾處理,去除危險字符 133 :return: 返回處理後的參數 134 """ 135 # 若是參數爲空,則返回該參數不容許爲空的json串給前端 136 if is_check_null and not args_value: 137 if notify_msg: 138 return_raise(return_msg(-1, notify_msg)) 139 else: 140 return_raise(return_msg(-1, "%s 不容許爲空" % msg)) 141 elif not args_value: 142 return args_value 143 144 # 把utf-8的url編碼解碼成中文字符 145 try: 146 args_value = urllib.parse.unquote(args_value) 147 except: 148 pass 149 150 # 替換特殊的空字符 151 args_value = args_value.replace(u'\xa0', u'') 152 # 是否字符串兩端去空格 153 if is_strip: 154 args_value = args_value.strip() 155 # 判斷是否超出指定長度 156 if lenght > 0 and len(args_value) > lenght: 157 return_raise(return_msg(-1, "%s 超出 %s 個字符" % (msg, lenght))) 158 159 # 若是參數含有特殊字符,則返回該參數不容許有特殊字符的json串給前端 160 if is_check_special_char: 161 re_result = re.search('\||<|>|&|%|~|\^|;|\'', args_value) 162 if re_result: 163 return_raise(return_msg(-1, "%s 含有特殊字符,請從新輸入" % msg)) 164 return args_value
get_ip():獲取當前客戶端ip地址
get_session():獲取當前客戶的session
return_msg():生成統一的返回給客戶端的內容(json格式)。輸出內容有state:狀態碼,通常使用-1表示出現錯誤,0表示正常,能夠根據須要進行修改或添加更多的狀態碼;msg:狀態文說明,出錯時返回出錯內容提示;data:須要返回的其餘內容所有會放在這裏。
return_raise():當調用這個函數時,會直接終於代碼的執行,直接將結果輸出到客戶端。
get_form():獲取客戶端Form方式提交的參數值
get_query():獲取客戶端Get方式提交的參數值
版權聲明:本文原創發表於 博客園,做者爲 AllEmpty 本文歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然視爲侵權。
python開發QQ羣:669058475(本羣已滿)、733466321(能夠加2羣) 做者博客:http://www.cnblogs.com/EmptyFS/