/* 1. 正則表達式就是描述字符串排列模式的一種自定義語法規則。
* 2. 如果可以使用字符串處理函數完成的任務,就不要使用正則
* 3. 有一些複雜的操作,只能使用正則完成。
*
* 正則表達式可以在很多計算機語言中應用
*
* 4. 正則表達式也稱為一種模式表達式。
* 5.正則表達式就是通過構建具有特定規則的模式,與輸入的字符信息比較。再進行分割、匹配、查找、替換等工作
*
* "/\\/"
*
* 一、正則表達式也是一個字符串
* 二、由具有特殊意義的字符組成的字符串
* 三、具有一點編寫規則,也是一種模式
* 四、看作是一種編程語言(是用一些特殊字符,按規則編寫出一個字符串,形成一種模式---正則表達式)
*
*
* 注意: 如果正則表達式,不和函數一起使用,則它就是一個字符串,如果將正則表達式放到到某個函數中使用, 才能發揮出正則表達式的作用。
*
* 用到分割函數中,就可以用這個正則去分割字符串
* 用到替換函數中,就可以用這個正則去替換字符串
* ...
*
*在PHP中給我們提供兩套正則表達式函數庫
POSIX 擴展正則表達式函數(ereg_)
Perl 兼容正則表達式函數(preg_)
這個函數功能一樣, 找一個處理字符串效率高的
注意:推薦使用Perl 兼容正則表達式函數庫(只學這一種)
學習正則表達式時,有兩方面需要學習:
一、正則表達式的模式如何編寫
語法:
1. 定界符號 //
除了字母、數字和正斜線\\ 以外的任何字符都可以為定界符號
| |
/ /
{ }
! !
沒有特殊需要,我們都使用正斜線作為正則表達式的定界符號
2. 原子 img \\s .
注意:原子是正則表達式的最基本組成單位,而且必須至少要包含一個原子
只要一個正則表達式可以單獨使用的字符,就是原子
1. 所有打印(所有可以在屏幕上輸出的字符串)和非打印字符(看不到的)
2. \\. \\* \\+ \\? \\( \\ 如果所有有意義的字符,想作為原子使用,統統使用 ”\\“轉義字符轉義 m
" \\ "轉義字符可以將有意的字符轉成沒意義的字符,還可以將沒意義的字符轉為有意義的字符
3. 在正則表達式中可以直接使用一些代表範圍的原子
\\d : 表示任意一個十進制的數字 [0-9]
\\D : 表示任意一個除數字這外的字符 [^0-9]
\\s : 表示任意一個空白字符,空格、\\n\\r\\t\\f [\\n\\r\\t\\f ]
\\S : 表示任意一個非空白 [^\\n\\r\\t\\f ]
\\w : 表示任意一個字 a-zA-Z0-9_ [a-zA-Z_]
\\W : 表示任意一個非字, 除了a-zA-Z0-9_以外的任意一個字符 [^a-zA-Z0-9_]
4. 自己定義一個原子表[], 可以匹配方括號中的任何一個原子
[a-z5-8]
[^a-z] 表示取反, 就是除了原子表中的原子,都可以表示(^必須在[]內的第一個字符處出現)
.
3. 元字符 * ?
元字符是一種特殊的字符,是用來修飾原子用的,不可以單獨出現
* : 表示其前的原子可以出現 0次、1次、或多次 {0,}
+ : 表示其前的原子可以出現1次 或多次, 不能沒有最少要有一個 {1,}
? : 表示其前面的原子可以出現0次或1次, 有隻能有一次,要麼沒有 {0,1}
{} : 用於自己定義前面原子出現的次數
{m} //m表示一個整數, {5}表示前面的原子出現5次
{m,n} //m和n表示一個整數,{2,5} m要小於n, 表示前面出現的原子,最少m次,最多n次,包括m和n次
{m,} //表示前面的原子最少出現m次,最多無限
. : 默認情況下,表示除換行符外任意一個字符
^ : 直接在一個正則表達式的第一個字符出現,則表達必須以這個正則表達式開始
$ : 直接在一個正則表達式的最後一個字符出現,則表達必須以這個正則表達式結束
| : 表示或的關係 , 它的優先級號是最低的, 最後考慮它的功能
\\b : 表示一個邊界
\\B : 表示一個非邊界
() : 重點
一、 () 作用: 是作為大原子使用
二、 改變優先級,加上括號可以提高優先級別
三、 作為子模式使用, 正則表達式不先對一個字符串匹配一次, 全部匹配作為一個大模式,放到數組的第一個元素中,每個()是一個子模式按順序放到數組的其它元素中去。
四、可以取消子模式,就將()作為大原子或改變優先級使用, 在括號中最前面使用"?:"就可以取消這個()表示的子模式
五、反向引用, 可以在模式中直接將子模式取出來,再作為正則表達式模式的一部分, 如果是在正則表達式像替換函數preg_replace函數中, 可以將子模式取出, 在被替換的字符串中使用
\\1 取第一個子模式、 \\2取第二個子模式, .... \\5 (注意是單引號還是雙引號引起來的正則)
"\\\\1"
'\\1'
${1} ${2}
\\* \\+ \\. \\?
\\
() (?:) []
* + ? {}
^ $ \\b
|
4. 模式修正符號 i u
"/ /模式修正符"
1. 就是幾個字母
2. 可以一次使用一個,每一個具一定的意義, 也可以連續使用多個
3. 是對整個正則表達式調優使用, 也可以說是對正則表達式功能的擴展
"/abc/" 只能匹配小寫字母 abc
"/abc/i" 可以不區分大小寫匹配 ABC abc Abc ABc AbC
i : 表示在和模式進行匹配進不區分大小寫
m : 默認情況,將字符串視為一行 ^ $ 視為多行後,任何一行都可以以正則開始或結束
s : 如果沒有使用這個模式修正符號時, 元字符中的"."默認不能表示換行符號,將字符串視為單行
x : 表示模式中的空白忽略不計
e : 正則表達式必須使用在preg_replace替換字符串的函數中時才可以使用(講這個函數時再說)
A :
Z :
U : 正則表達式的特點:就是比較”貪婪“ .* .+ 所有字符都符合這個條件
一種使用模式修正符號 U
加一種是使用?完成 .*? .+?
如果兩種方式同時出現又開啟了 貪婪模式 .*? /U
"/\\/iU"
"#\\#iU"
/原子和元字符/模式修正符號 / 為定界符號 (有一些語言是不需要這個定界符號)
有點語言中不支持模式修正符號 javascript
用戶名不能為空 /^\\S+$/
url
電話
將一個網站中的所有圖片取出
將一個網站的所有商品取出,
二、學習正則表達式的強大處理函數
preg_match();
*
*
*
*
*/
$pattern="/\\(.*?)\\/Ui"; //正則表達式模式
$string="helloaaaaaaphpaacaaaathis is testaaaaalampaaaaaaaa"; //需要和上面模式字符串進行匹配的變量字符串
if(preg_match_all($pattern, $string, $arr)){
echo "正則表達式 {$pattern} 和字符串 {$string} 匹配成功
";
echo '
';';print_r($arr);
echo '
}else{
echo "正則表達式{$pattern} 和字符串 {$string} 匹配失敗/<font>";
}
閱讀更多 三木益達 的文章