導航:首頁 > 凈水問答 > mysql正則過濾特殊字元

mysql正則過濾特殊字元

發布時間:2022-11-28 06:57:00

❶ mysql 正則查詢問題

MySQL中的模式匹配(標准SQL匹配和正則表達式匹配)

1. 使用LIKE和NOT LIKE比較操作符(注意不能使用=或!=);

2. 模式默認是忽略大小寫的;

3. 允許使用」_」匹配任何單個字元,」%」匹配任意數目字元(包括零字元);

MySQL還提供象UNIX實用程序的擴展正則表達式模式匹配的格式:

1. 使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,他們是同義詞);

2. REGEXP模式匹配與被匹配字元的任何地方匹配,則匹配成功(即只要被匹配字元包含或者可以等於所定義的模式,就匹配成功);

不同於LIKE模式匹配,只有和整個值匹配,才匹配成功(即只有被匹配字元完全和所定義的模式匹配,才匹配成功)

3. REGEXP默認也是不區分大小寫,可以使用BINARY關鍵詞強制區分大小寫;

如:SELECT * FROM pet WHERE name REGEXP BINARY 『^B』;

4. 正則表達式為一個表達式,它能夠描述一組字元串。REGEXP操作符完成MySQL的擴展正則表達式匹配。REGEXP實現的功能是如果被匹配字元中部分或完全符合所定義的表達式描述的字元,則表示匹配成功。

1)最簡單的正則表達式是不含任何特殊字元的正則表達式,如hello。

SELECT * FROM pet WHERE name REGEXP 『hello』;表示的意思是如果name這列的某一行包含hello這個單詞,則匹配就成功了。(注意和LIKE的區別,LIKE要求name這列的某一行必須完全等於hello,才匹配成功)。

2)非平凡的正則表達式,除了含有最簡單表達式那些東西,還需要採用特殊的特殊結構,用到的字元,往下看。(因此,通常的正則表達式是普通單詞和這些正則表達式字元構成的表達式)

5. 擴展正則表達式的一些字元:

1) 『.』匹配任何單個字元;

2) […]匹配在方括弧內的任何字元,可以使用』-』表示範圍,如[a-z],[0-9],而且可以混合[a-dXYZ]表示匹配a,b,c,d,X,Y,Z中的任何一個;(注意使用括弧以及』|』的方法也可以達到相同的效果,如(a|b|c)匹配a,b,c中的任何一個);此外可以使用』^』表示否定,如[^a-z]表示不含有a-z中間的任何一個字元;

3) 『*』表示匹配0個或多個在它前面的字元。如x*表示0個或多個x字元,.*表示匹配任何數量的任何字元;

4) 可以將模式定位必須匹配被匹配字元的開始或結尾,在匹配模式前加」^」:表示匹配從被匹配字元的最開頭開始,在匹配模式後加」$」:表示匹配要進行到被匹配字元的最末尾。

5) 『+』表示匹配1個或多個在它前面的字元。如a+表示1個或多個a字元。

6) 『?』表示匹配0個或1個在它前面的字元。如a?表示0個或1個a字元。

7) 『|』如de|abc表示匹配序列de或者abc。注意雖然[…]也可以表示匹配中的某一個,但是每次僅僅能表示單個字元及[a-bXYZ]實際每一次只代表了一個字元。

8) ()括弧可以應用在表達式中,使得更容易理解。

9) a{5}表示匹配共5個a,a{2,8}表示匹配2~8個a。

a*可以寫成a{0, } 第二個參數省略表示沒有上界;a+可以寫成a{1,};a?可以寫成a{0,1}

更准確地講,a{n}與a的n個實例准確匹配。a{n,}匹配a的n個或更多實例。a{m,n}匹配a的m~n個實例,包含m和n
m和n必須位於0~RE_DUP_MAX(默認為255)的范圍內,包含0和RE_DUP_MAX。如果同時給定了m和n,m必須小於或等於n。
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

10) 標准類別[:character_class:]:

常用的一些標准類別,一般在[]中使用,由於用在[]中故和[a-z]類似,每一次只能頂替一個字元。(這個有點類似perl裡面定義的常用的一些標准類別:\w表示一個單詞字元即[a-zA-Z0-9];\W一個非單詞字元與\w相反; \d一個數字即[0-9];\D一個非數字;\s一個白空間字元即[\t\f\r\n];\f為換頁符;\S一個非白空間字元)

標準的類別名稱:

alnum
文字數字字元

alpha
文字字元

blank
空白字元

cntrl
控制字元

digit
數字字元

graph
圖形字元

lower
小寫文字字元

print
圖形或空格字元

punct
標點字元

space
空格、製表符、新行、和回車

upper
大寫文字字元

xdigit
十六進制數字字元

使用實例:

SELECT 'justalnums' REGEXP '[[:alnum:]]+';解釋其中[[:alnum:]]由於[:alnum:]表示文字數字字元,它又用在[]中,故[[:alnum:]]代表一個字元它為一個文字或者數字。後面的+號表示1個或多個這樣的文字或數字。

上述語句返回1.那是因為justalnums中是由字母組成的。

11)字邊界:[[:<:]]表示開始,[[:>:]]表示結束:

其定義了一個單詞的開始和結束邊界,這個單詞為字字元,這樣[[:<:]]代表這個字字元前面的部分,[[:>:]]代表這個字字元後面的部分。字字元為alnum類的字母數字字元或下劃線(_);因此[[:<:]], [[:>:]]均代表不是字字元的字元,即只要不是字母數字字元以及下劃線(_)即可。因此其可以為什麼都不是。因此[[:<:]]word[[:>:]]能夠匹配如下的所有情況:

即word單詞本身,word*** 解釋***代表不是字母數字以及_的任何字元(如,word-net);***word(如,micorsoft word);***word***(如,this is a word program.)

舉例:[[:<:]]word[[:>:]]:

SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; 結果為真SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; 結果為假 最後注意的注意:要在正則表達式中使用特殊字元,需要在這些字元前面添加2個反斜杠』\』,舉例:SELECT '1+2' REGEXP '1+2'; 結果為0SELECT '1+2' REGEXP '1\+2'; 結果為0SELECT '1+2' REGEXP '1\\+2'; 結果為1解釋:這是因為MySQL解析程序解析該SQL語句時:首先將字元串』1\\+2』解析為1\+2;然後把1\+2當作正則表達式,由正則表達式庫來解析,它代表1+2。因此需要加上2個反斜杠。 不要經常犯加一個反斜杠的錯誤,加一個反斜杠會莫名其妙:如SELECT '1t2' REGEXP '1\t2';結果會返回1本來的意思是匹配1製表符\t以及2,但是由於只添加了一個\所以,解析以後編程了1t2,所以匹配成功。12)[.characters.]和[=character_class=] 參考資料:

http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matching MySQL的模式匹配

http://dev.mysql.com/doc/refman/5.1/zh/regexp.html MySQL的正則表達式匹配

=========================================================================================================

正則表達式:
正則表達式是為復雜搜索指定模式的強大方式。
^
所匹配的字元串以後面的字元串開頭
mysql> select "fonfo" REGEXP "^fo$"; -> 0(表示不匹配)
mysql> select "fofo" REGEXP "^fo"; -> 1(表示匹配)
$
所匹配的字元串以前面的字元串結尾
mysql> select "fono" REGEXP "^fono$"; -> 1(表示匹配)
mysql> select "fono" REGEXP "^fo$"; -> 0(表示不匹配)
.
匹配任何字元(包括新行)
mysql> select "fofo" REGEXP "^f.*"; -> 1(表示匹配)
mysql> select "fonfo" REGEXP "^f.*"; -> 1(表示匹配)
a*
匹配任意多個a(包括空串)
mysql> select "Ban" REGEXP "^Ba*n"; -> 1(表示匹配)
mysql> select "Baaan" REGEXP "^Ba*n"; -> 1(表示匹配)
mysql> select "Bn" REGEXP "^Ba*n"; -> 1(表示匹配)

a+
匹配1個或多個a字元的任何序列。

mysql> select "Ban" REGEXP "^Ba+n"; -> 1(表示匹配)
mysql> select "Bn" REGEXP "^Ba+n"; -> 0(表示不匹配)

a?
匹配一個或零個a
mysql> select "Bn" REGEXP "^Ba?n"; -> 1(表示匹配)
mysql> select "Ban" REGEXP "^Ba?n"; -> 1(表示匹配)
mysql> select "Baan" REGEXP "^Ba?n"; -> 0(表示不匹配)

de|abc
匹配de或abc
mysql> select "pi" REGEXP "pi|apa"; -> 1(表示匹配)
mysql> select "axe" REGEXP "pi|apa"; -> 0(表示不匹配)
mysql> select "apa" REGEXP "pi|apa"; -> 1(表示匹配)
mysql> select "apa" REGEXP "^(pi|apa)$"; -> 1(表示匹配)
mysql> select "pi" REGEXP "^(pi|apa)$"; -> 1(表示匹配)
mysql> select "pix" REGEXP "^(pi|apa)$"; -> 0(表示不匹配)

(abc)*
匹配任意多個abc(包括空串)
mysql> select "pi" REGEXP "^(pi)*$"; -> 1(表示匹配)
mysql> select "pip" REGEXP "^(pi)*$"; -> 0(表示不匹配)
mysql> select "pipi" REGEXP "^(pi)*$"; -> 1(表示匹配)

{1} {2,3}
這是一個更全面的方法,它可以實現前面好幾種保留字的功能
a*
可以寫成a{0,}
a
可以寫成a{1,}
a?
可以寫成a{0,1}
在{}內只有一個整型參數i,表示字元只能出現i次;在{}內有一個整型參數i,
後面跟一個「,」,表示字元可以出現i次或i次以上;在{}內只有一個整型參數i,
後面跟一個「,」,再跟一個整型參數j,表示字元只能出現i次以上,j次以下
(包括i次和j次)。其中的整型參數必須大於等於0,小於等於 RE_DUP_MAX(默認是25
5)。 如果同時給定了m和n,m必須小於或等於n.

[a-dX], [^a-dX]

匹配任何是(或不是,如果使用^的話)a、b、c、d或X的字元。兩個其他字元之間的「-」字元構成一個范圍,與從第1個字元開始到第2個字元之間的所有字元匹配。例如,[0-9]匹配任何十進制數字 。要想包含文字字元「]」,它必須緊跟在開括弧「[」之後。要想包含文字字元「-」,它必須首先或最後寫入。對於[]對內未定義任何特殊含義的任何字元,僅與其本身匹配。

mysql> select "aXbc" REGEXP "[a-dXYZ]"; -> 1(表示匹配)
mysql> select "aXbc" REGEXP "^[a-dXYZ]$"; -> 0(表示不匹配)
mysql> select "aXbc" REGEXP "^[a-dXYZ] $"; -> 1(表示匹配)
mysql> select "aXbc" REGEXP "^[^a-dXYZ] $"; -> 0(表示不匹配)
mysql> select "gheis" REGEXP "^[^a-dXYZ] $"; -> 1(表示匹配)
mysql> select "gheisa" REGEXP "^[^a-dXYZ] $"; -> 0(表示不匹配)

[[.characters.]]
表示比較元素的順序。在括弧內的字元順序是唯一的。但是括弧中可以包含通配符,
所以他能匹配更多的字元。舉例來說:正則表達式[[.ch.]]*c匹配chchcc的前五個字元


[=character_class=]
表示相等的類,可以代替類中其他相等的元素,包括它自己。例如,如果o和( )是
一個相等的類的成員,那麼[[=o=]]、[[=( )=]]和[o( )]是完全等價的。

[:character_class:]
在括弧裡面,在[:和:]中間是字元類的名字,可以代表屬於這個類的所有字元。
字元類的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、uppe
r、cntrl、print和xdigit
mysql> select "justalnums" REGEXP "[[:alnum:]] "; -> 1(表示匹配)
mysql> select "!!" REGEXP "[[:alnum:]] "; -> 0(表示不匹配)

[[:<:]]
[[:>:]]
分別匹配一個單詞開頭和結尾的空的字元串,這個單詞開頭和結尾都不是包含在alnum中
的字元也不能是下劃線。
mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -> 1(表示匹配)
mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -> 0(表示不匹配)
mysql> select "weeknights" REGEXP "^(wee|week)(knights|nights)$"; -> 1(表示
匹配)

要想在正則表達式中使用特殊字元的文字實例,應在其前面加上2個反斜杠「\」字元。MySQL解析程序負責解釋其中一個,正則表達式庫負責解釋另一個。例如,要想與包含特殊字元「+」的字元串「1+2」匹配,在下面的正則表達式中,只有最後一個是正確的:

mysql> SELECT '1+2' REGEXP '1+2'; -> 0
mysql> SELECT '1+2' REGEXP '1\+2'; -> 0
mysql> SELECT '1+2' REGEXP '1\\+2'; -> 1

全文檢索:
====================================================================================================
在括弧裡面,在[:和:]中間是字元類的名字,可以代表屬於這個類的所有字元。字元類的名字有: alnum、digit、punct、alpha、graph、space、blank、lower、upper、cntrl、print和xdigit

mysql> select "justalnums" REGEXP "[[:alnum:]]+"; -> 1(表示匹配)

mysql> select "!!" REGEXP "[[:alnum:]]+"; -> 0(表示不匹配)

[[:<:]]

[[:>:]]

分別匹配一個單詞開頭和結尾的空的字元串,這個單詞開頭和結尾都不是包含在alnum中的字元也不能是下劃線。

mysql> select "a word a" REGEXP "[[:<:]]word[[:>:]]"; -> 1(表示匹配)

mysql> select "a xword a" REGEXP "[[:<:]]word[[:>:]]"; -> 0(表示不匹配)

mysql> select "weeknights" REGEXP "^(weeweek)(knightsnights)$"; -> 1(表示匹配)

過濾字元串內特殊字元的正則表達式

s/[\W\_]+//g; 但是注意你的字元串中不要有中文,否則....

❸ 防止mysql注入腳本應避免哪些特殊字元

防止SQL注入,我們需要注意以下幾個要點:
1.永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和 雙"-"進行轉換等。
2.永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
3.永遠不要使用管理員許可權的資料庫連接,為每個應用使用單獨的許可權有限的資料庫連接。
4.不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
5.應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
6.sql注入的檢測方法一般採取輔助軟體或網站平台來檢測,軟體一般採用sql注入檢測工具jsky,網站平台就有億思網站安全平台檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。

❹ mysql正則表達式替換字元串

mysql的正則匹配用regexp,而替換字元串用REPLACE(str,from_str,to_str)
舉例如下:
UPDATE myTable SET HTML=REPLACE(HTML,'<br>','') WHERE HTML REGEXP '(<br */*>\s*){2,}'
達到的效果:會把所有<br>全部替換掉。
mysql中常用的替換函數

所用到的函數:
locate:

LOCATE(substr,str)
POSITION(substr IN str)
返回子串 substr 在字元串 str 中第一次出現的位置。如果子串 substr 在 str 中不存在,返回值為 0:

substring

SUBSTR(str,pos,len): 由<str>中的第<pos>位置開始,選出接下去的<len>個字元。

replace

replace(str1, str2, str3): 在字串 str1 中,當str2 出現時,將其以 str3 替代。

❺ 正則表達式過濾特殊字元

正則表達式裡面你帶了逗號,應該這樣寫
[。~!@#$%\^\+\*&\\\/\?\|:\.<>{}()';="]
有些符號只有少數幾個符號需要轉義,而且不用打逗號,打了逗號就相當於把逗號也過濾掉了

❻ MySQL正則表達式匹配

1. 基本字元匹配:
select name from user where name REGEXP 񟝘'
檢索name中包含文本1000的所有行。

select name from user where name REGEXP '.000'
.在正則表達式中表示匹配任意一個字元。

2. 進行OR匹配:
select name from user where name REGEXP 񟝘|2000'
檢索name中包含文本1000或2000的所有行。

3. 匹配幾個字元之一:
select name from user where name REGEXP '[123] Ton'
[123]定義一組字元,它的意思是匹配1或2或3。

select name from user where name REGEXP '[1-3] Ton'
-用來定義一個范圍。

4. 匹配特殊字元:
匹配特殊字元,必須用為前導,-表示查找-,.表示查找.

5. 匹配多個實例:
*: 0個或多個匹配;
+:1個或多個匹配(等於{1,});
?:0個或1個匹配(等於{0,1});
{n}:指定數目的匹配;
{n,}:不少於指定數目的匹配;
{n,m}:匹配數目的范圍(m不超過255)。

6. 定位符:
^:文本的開始;
$:文本的結尾;
[[:<:]]:詞的開始;
[[:>:]]:詞的結尾;
^在集合中:用來否定該集合,例如[^0-9],表示不匹配數字

❼ MYSQl 特殊字元

MYSQL不會自動過濾特殊的字元。
正因為不會所以才會產生漏洞。如果在一些軟體或網站界面上向mysql輸入單引號的話,它也會簡單的判斷為執行語句的一部分,這樣就可以利用一些簡單的排列而非法訪問資料庫。
比如上面的哥們提起的
select * from user where username='' or ''='' and password='' or ''=''
其中的''=''代表的是'真'
那麼本來需要判斷用戶名=?密碼=?兩個判斷都必須為真才能進入網站頁面或者程序,結果變成了用戶名=?或者'真' 並且 密碼=?或者'真'
不管用戶名密碼有沒有添對反正可以得到結果為'真',這樣就非法登陸了系統並且可以造成破壞。

❽ 求一個正則表達式過濾特殊字元但是不過濾@下劃線之類的

這個的話也可以通過正則限定允許輸入的字元來實現
比如說:字母開頭6-15位字元就可以寫成如下方式
/^[a-zA-Z][a-zA-Z0-9]{5,15}$/
這樣也可以達到過濾特殊字元的效果

❾ sql中如何判斷字元串中含有特殊字元

1、打開終端窗口,輸入mysql -u-root -p,進入mysql。

❿ 避免mysql注入應該避免有哪些特殊字元

特殊字元有:

SQL中通配符的使用


SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字元串,欺騙伺服器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL注入式攻擊。

閱讀全文

與mysql正則過濾特殊字元相關的資料

熱點內容
超級可愛小說txt下載 瀏覽:659
夢見提一桶污水 瀏覽:653
泰國最好看的三極片 瀏覽:4
化妝品倒水裡污水怎麼處理 瀏覽:102
100k超濾管是什麼意思 瀏覽:945
油煙凈化器兩頭用什麼變徑 瀏覽:555
給眼睛按個摩電影叫什麼 瀏覽:924
空氣凈化器怎麼算面積 瀏覽:260
印染廢水苯胺如何去除 瀏覽:898
太陽能熱水器處水垢 瀏覽:438
影院入口免費 瀏覽:984
最新免費不卡電影網 瀏覽:838
凈水器水口怎麼連接 瀏覽:852
泰國蛇姬戀演員表 瀏覽:577
污水不沉降怎麼辦 瀏覽:235
喜悅100汽油濾芯在哪裡 瀏覽:289
下置水桶飲水機怎麼換水桶 瀏覽:701
剛蒸餾的酒多久能喝 瀏覽:695
下一次雨污水處理廠能掙多少錢 瀏覽:879
樹脂選用導則 瀏覽:962