這篇文章帶給大家的內容是關於php正規的內容總結(詳細),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
1.正規基礎知識
行定位符(^與$)
行定位符是用來描述字串的邊界。 「$」表示行結尾「^」表示行開始如"^de",表示以de開頭的字串 "de$",表示以de結尾的字串。
單字定界符
我們在尋找的一個單字的時候,如an是否在一個字串”gril and body」中存在,很明顯如果匹配的話,an肯定是可以匹配字串“gril and body”匹配到,怎樣才能讓其匹配單詞,而不是單字的一部分?這時候,我們可以是喲個單字定界符\b。
\ban\b 去配對」gril and body」的話,就會提示配對不到。
當然還有一個大寫的\B,它的意思,和\b正好相反,它匹配的字串不能使一個完整的單詞,而是其他單字或字串中的一部分。如\Ban\B。
選擇字元(|) ,表示或
選擇字元表示或的意思。如Aa|aA,表示Aa或aA的意思。注意使用”[]”與”|”的區別,在於”[]”只能匹配單個字符,而”|”可以匹配任意長度的字符串。在使用”[]”的時候,往往配合連接字符”-“一起使用,如[a-d],代表a或b或c或d。
排除字符,排除操作
正則表達式提供了”^”來表示排除不符合的字符,^一般放在[]中。如[^1-5],該字元不是1~5之間的數字。
限定符(?* {n,m})
限定符主要是用來限定每個字串出現的次數。
限定字元 | 意義 |
---|---|
? | 零次或一次 |
* | 零次或多次 |
一次或多次 | |
{n} | #n次 |
{n,} | ##至少n次 |
{n,m} | n到m次 |
如(D )表示一個或多個D
點號運算子
符合任一個字元(不包含換行符號)
表達式中的反斜線(\)
#表達式中的反斜線有多重意義,如轉義、指定預先定義的字符集、定義斷言、顯示不列印的字元。
轉義字元
轉義字元主要是將一些特殊字元轉換為普通字元。而這些常用特殊字元有”.”,”?”、”\”等。
指定預先定義的字元集
字元 | #意義 |
---|---|
\d | 任一個十進制數字[0-9] |
\D | 任一個非十進制數字 |
\s | 任一個空白字元(空格、換行符號、換頁符號、回車符、字表符) |
\S | 任一個非空白字元 |
\w | 任意一個單字字元 |
\W | 任意個非單字字元 |
#字元 | 意義 |
---|---|
\a | 警報 |
\b | 退格 |
\f | 換頁 |
\n | 換行 |
\r | 回車 |
\t | 字表符 |
括號字元()
在正規表示式中小括號的作用主要有:
改變限定符如( |、* 、^)的作用範圍
模式修飾符
#模式修飾符的作用是設定模式,也就是正規表示式如何解釋。 php中主要模式如下表:修飾符 | 說明 |
---|---|
i | 忽略大小寫 |
m | 多文字模式 |
s | 單行文字模式 |
#x
|
忽略空白字元 |
U 懶惰模式(不寫預設貪婪模式)
2.常用php正規函數及範例
a. preg_grep() 函數
#preg_grep 函數用於傳回符合模式的陣列條目。
array preg_grep ( string $pattern , array $input [, int $flags = 0 ] )
傳回給定陣列 input 中與模式 pattern 相符的元素組成的陣列。
參數說明:
$pattern:要搜尋的模式,字串形式。
$input:輸入的陣列。
$flags:如果設定為 PREG_GREP_INVERT,這個函數會傳回輸入陣列中與給定模式 pattern 不符的元素組成的陣列。
傳回數組中指定匹配的元素:
<?php $array = array(1, 2, 3.4, 53, 7.9); // 返回所有包含浮点数的元素 $fl_array = preg_grep("/^(\d+)?\.\d+$/", $array); print_r($fl_array); ?>
執行結果如下所示:
Array ( [2] => 3.4 [4] => 7.9 )
可以看出preg_grep 只回傳了陣列中的浮點數。
b.preg_match() 函數
PHP 正規表示式(PCRE)
preg_last_error 函數用來執行一個正規表示式符合。
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜尋 subject 與 pattern 給定的正規表示式的一個匹配。
參數說明:
$pattern: 要搜尋的模式,字串形式。
$subject: 輸入字串。
$matches: 如果提供了參數matches,它將被填入搜尋結果。 $matches[0]將包含完整模式匹配到的文本, $matches[1] 將包含第一個捕獲子組匹配到的文本,以此類推。
$flags:flags 可以被設定為以下標記值:
PREG_OFFSET_CAPTURE: 如果傳遞了這個標記,對於每一個出現的匹配返回時會附加字串偏移量(相對於目標字串的)。注意:這會改變填充到matches參數的數組,使其每個元素成為由第0個元素是匹配到的字串,第1個元素是該匹配字串在目標字串subject中的偏移量。
offset: 通常,搜尋會從目標字串的開始位置開始。可選參數 offset 用於 指定從目標字串的某個未知開始搜尋(單位是位元組)。
傳回 pattern 的符合次數。它的值將是 0 次(不匹配)或 1 次,因為 preg_match() 在第一次匹配後 將會停止搜尋。 preg_match_all() 不同於此,它會一直搜尋subject 直到到達結尾。如果發生錯誤preg_match()回傳 FALSE。
<?php //模式分隔符后的"i"标记这是一个大小写不敏感的搜索 if (preg_match("/php/i", "PHP is the web scripting language of choice.")) { echo "查找到匹配的字符串 php。"; } else { echo "未发现匹配的字符串 php。"; } ?>
執行結果如下所示:
查找到匹配的字符串 php。
<?php /* 模式中的\b标记一个单词边界,所以只有独立的单词"web"会被匹配,而不会匹配 * 单词的部分内容比如"webbing" 或 "cobweb" */ if (preg_match("/\bweb\b/i", "PHP is the web scripting language of choice.")) { echo "查找到匹配的字符串。\n"; } else { echo "未发现匹配的字符串。\n"; } if (preg_match("/\bweb\b/i", "PHP is the website scripting language of choice.")) { echo "查找到匹配的字符串。\n"; } else { echo "未发现匹配的字符串。\n"; } ?>
執行結果如下所示:
查找到匹配的字符串。 未发现匹配的字符串。
<?php // 从URL中获取主机名称 preg_match('@^(?:http://)?([^/]+)@i', "http://www.runoob.com/index.html", $matches); $host = $matches[1]; // 获取主机名称的后面两部分 preg_match('/[^.]+\.[^.]+$/', $host, $matches); echo "domain name is: {$matches[0]}\n"; ?>
執行結果如下所示:
domain name is: runoob.com
PHP 正規表示式(PCRE)
preg_match_all 函數用於執行一個全域正規表示式匹配。
int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )
搜尋 subject 中所有符合 pattern 給定正規表示式的符合結果並且將它們以 flag 指定順序輸出到 matches 中。
在第一個匹配找到後, 子序列繼續從最後一次匹配位置搜尋。
參數說明:
$pattern: 要搜尋的模式,字串形式。
$subject: 輸入字串
$matches: 多維數組,作為輸出參數輸出所有匹配結果, 數組排序透過flags指定。
$flags:可以結合下面標記使用(注意不能同時使用PREG_PATTERN_ORDER和PREG_SET_ORDER):
PREG_PATTERN_ORDER: 結果排序為$matches[0]保存完整模式的所有匹配, $matches[ 1] 保存第一個子組的所有匹配,以此類推。
PREG_SET_ORDER: 結果排序為$matches[0]包含第一次匹配得到的所有匹配(包含子組), $matches[1]是包含第二次匹配到的所有匹配(包含子組)的數組,以此類推。
PREG_OFFSET_CAPTURE: 如果這個標記被傳遞,每個發現的匹配回傳時會增加它相對目標字串的偏移量。
offset: 通常, 尋找時從目標字串的起始位置開始。可選參數offset用於 從目標字串中指定位置開始搜尋(單位是位元組)。
傳回完整符合次數(可能是0),或如果發生錯誤回傳FALSE。
<?php $userinfo = "Name: <b>PHP</b> <br> Title: <b>Programming Language</b>"; preg_match_all ("/<b>(.*)<\/b>/U", $userinfo, $pat_array); print_r($pat_array[0]); ?>
執行結果如下所顯示:
Array ( [0] => <b>PHP</b> [1] => <b>Programming Language</b> )
preg_replace 函數執行一個正規表示式的搜尋和取代。
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜尋 subject 中符合 pattern 的部分, 以 replacement 取代。
參數說明:
$pattern: 要搜尋的模式,可以是字串或字串陣列。
$replacement: 用於替換的字串或字串陣列。
$subject: 要搜尋已取代的目標字串或字串陣列。
$limit: 可選,對於每個模式用於每個 subject 字串的最大可替換次數。預設是-1(無限制)。
$count: 可选,为替换执行的次数。(用于统计被替换的次数)
如果 subject 是一个数组, preg_replace() 返回一个数组, 其他情况下返回一个字符串。
如果匹配被查找到,替换后的 subject 被返回,其他情况下 返回没有改变的 subject。如果发生错误,返回 NULL。
<?php $string = 'google 123, 456'; $pattern = '/(\w+) (\d+), (\d+)/i'; $replacement = 'runoob ${2},$3'; echo preg_replace($pattern, $replacement, $string); ?>
执行结果如下所示:
runoob 123,456
<?php $str = 'runo o b'; $str = preg_replace('/\s+/', '', $str); // 将会改变为'runoob' echo $str; ?>
执行结果如下所示:
runoob
<?php $string = 'The quick brown fox jumped over the lazy dog.'; $patterns = array(); $patterns[0] = '/quick/'; $patterns[1] = '/brown/'; $patterns[2] = '/fox/'; $replacements = array(); $replacements[2] = 'bear'; $replacements[1] = 'black'; $replacements[0] = 'slow'; echo preg_replace($patterns, $replacements, $string); ?>
执行结果如下所示:
The bear black slow jumped over the lazy dog.
<?php $count = 0; echo preg_replace(array('/\d/', '/\s/'), '*', 'xp 4 to', -1 , $count); echo $count; //3 ?>
执行结果如下所示:
xp***to 3
preg_replace 函数通过一个正则表达式分隔字符串。
array preg_split ( string $pattern , string $subject [, int $limit = -1 [, int $flags = 0 ]] )
通过一个正则表达式分隔给定字符串。
参数说明:
$pattern: 用于搜索的模式,字符串形式。
$subject: 输入字符串。
$limit: 可选,如果指定,将限制分隔得到的子串最多只有limit个,返回的最后一个 子串将包含所有剩余部分。limit值为-1, 0或null时都代表"不限制", 作为php的标准,你可以使用null跳过对flags的设置。
$flags: 可选,可以是任何下面标记的组合(以位或运算 | 组合):
PREG_SPLIT_NO_EMPTY: 如果这个标记被设置, preg_split() 将进返回分隔后的非空部分。
PREG_SPLIT_DELIM_CAPTURE: 如果这个标记设置了,用于分隔的模式中的括号表达式将被捕获并返回。
PREG_SPLIT_OFFSET_CAPTURE: 如果这个标记被设置, 对于每一个出现的匹配返回时将会附加字符串偏移量. 注意:这将会改变返回数组中的每一个元素, 使其每个元素成为一个由第0 个元素为分隔后的子串,第1个元素为该子串在subject 中的偏移量组成的数组。
返回一个使用 pattern 边界分隔 subject 后得到的子串组成的数组。
<?php //使用逗号或空格(包含" ", \r, \t, \n, \f)分隔短语 $keywords = preg_split("/[\s,]+/", "hypertext language, programming"); print_r($keywords); ?>
执行结果如下所示:
Array ( [0] => hypertext [1] => language [2] => programming )
<?php $str = 'runoob'; $chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY); print_r($chars); ?>
执行结果如下所示:
Array ( [0] => r [1] => u [2] => n [3] => o [4] => o [5] => b )
<?php $str = 'hypertext language programming'; $chars = preg_split('/ /', $str, -1, PREG_SPLIT_OFFSET_CAPTURE); print_r($chars); ?>
执行结果如下所示:
Array ( [0] => Array ( [0] => hypertext [1] => 0 ) [1] => Array ( [0] => language [1] => 10 ) [2] => Array ( [0] => programming [1] => 19 ) )
一、校验数字的表达式
1 数字:
^[0-9]*$
2 n位的数字:
^\d{n}$
3 至少n位的数字:
^\d{n,}$
4 m-n位的数字:
^\d{m,n}$
5 零和非零开头的数字:
^(0|[1-9][0-9]*)$
6 非零开头的最多带两位小数的数字:
^([1-9][0-9]*)+(.[0-9]{1,2})?$
7 带1-2位小数的正数或负数:
^(\-)?\d+(\.\d{1,2})?$
8 正数、负数、和小数:
^(\-|\+)?\d+(\.\d+)?$
9 有两位小数的正实数:
^[0-9]+(.[0-9]{2})?$
10 有1~3位小数的正实数:
^[0-9]+(.[0-9]{1,3})?$
11 非零的正整数:
^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
12 非零的负整数:
^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
13 非负整数:
^\d+$ 或 ^[1-9]\d*|0$
14 非正整数:
^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
15 非负浮点数:
^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
16 非正浮点数:
^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
17 正浮点数:
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
18 负浮点数:
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
19 浮点数:
^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
二、校验字符的表达式
1 汉字:
^[\u4e00-\u9fa5]{0,}$
2 英文和数字:
^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
3 长度为3-20的所有字符:
^.{3,20}$
4 由26个英文字母组成的字符串:
^[A-Za-z]+$
5 由26个大写英文字母组成的字符串:
^[A-Z]+$
6 由26个小写英文字母组成的字符串:
^[a-z]+$
7 由数字和26个英文字母组成的字符串:
^[A-Za-z0-9]+$
8 由数字、26个英文字母或者下划线组成的字符串:
^\w+$ 或 ^\w{3,20}$
9 中文、英文、数字包括下划线:
^[\u4E00-\u9FA5A-Za-z0-9_]+$
10 中文、英文、数字但不包括下划线等符号:
^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
11 可以输入含有^%&',;=?$\"等字符:
[^%&',;=?$\x22]+
12 禁止输入含有~的字符:
[^~\x22]+
三、特殊需求表达式
1、 Email位址:
^\w ([- .]\w )*@\w ([-.]\w )*\.\w ([-.]\w )*$
2 、網域:
[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA -Z0-9]{0,62}) /.?
3 、InternetURL:
[a-zA-z] ://[^\s]* 或^http://([\w -] \.) [\w-] (/[\w-./?%&=]*)?$
4 、手機號碼:
^(13[0-9]|14[5 |7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8 }$
5 、電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):
^(\(\ d{3,4}-)|\d{3.4}-)?\d{7,8}$
#6 國內電話號碼(0511-4405222、021-87888822):
\d{3} -\d{8}|\d{4}-\d{7}
7 、身分證字號:
15或18位元身分證:
^\d{15}|\d{ 18}$
15位元身分證:
^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2] \d)|3[0-1])\d{3}$
18位元身分證:
^[1-9]\d{5}[1-9]\d{3}( (0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$
8、 短身分證號碼(數字、字母x結尾):
^([0-9]){7,18}(x|X)?$
或
^\d{8,18}|[0- 9x]{8,18}|[0-9X]{8,18}?$
9 、帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):
^[ a-zA-Z][a-zA-Z0-9_]{4,15}$
10 、密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和底線):
^[a-zA-Z]\w{5,17}$
11 、強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間) :
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
#12、 日期格式:
^ \d{4}-\d{1,2}-\d{1,2}
13、一年的12個月(01~09和1~12):
^(0?[ 1-9]|1[0-2])$
14 、一個月的31天(01~09和1~31):
^((0?[1-9])|(( 1|2)[0-9])|30|31)$
15 、錢的輸入格式:
16 、1.有四種錢的表示形式我們可以接受:"10000.00" 和"10,000.00 ", 和沒有"分" 的"10000" 和"10,000":
^[1-9][0-9]*$
17、 2.這表示任一不以0開頭的數字,但是,這也意味著一個字元"0"不通過,所以我們採用下面的形式:
^(0|[1-9][0-9]*)$
18 、3.一個0或一個不以0開頭的數字.我們還可以允許開頭有一個負號:
^(0|-?[1-9][0-9]*)$
19 、4.這表示一個0或一個可能為負的開頭不為0的數字.讓用戶以0開頭好了.把負號的也去掉,因為錢總不能是負的吧.下面我們要加的是說明可能的小數部分:
^[0-9] (.[0-9] )?$
20 、5.必須說明的是,小數點後面至少應該有1位數,所以"10."是不通過的,但是"10" 和"10.2" 是經過的:
^[0-9] (.[0-9]{2})?$
21、 6.這樣我們規定小數點後面必須有兩位,如果你認為太苛刻了,可以這樣:
^[0-9] (.[0-9]{1,2})?$
22、7.這樣就允許用戶只寫一位小數.下面我們該考慮數字中的逗號了,我們可以這樣:
^[0-9]{1,3}(,[0-9]{3})*(.[0-9] {1,2})?$
23 、8.1到3個數字,後面跟著任何個逗號3個數字,逗號成為可選,而不是必須:
^([0-9] |[0 -9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
24 、備註:這就是最終結果了,別忘了" "可以用"*"替代如果你覺得空字串也可以接受的話(奇怪,為什麼?)最後,別忘了在用函數時去掉去掉那個反斜杠,一般的錯誤都在這裡
25 、xml檔:
^([a-zA-Z] -?) [a-zA-Z0-9] \\.[x|X][m|M][l|L]$
26 、中文字元的正規表示式:
[\u4e00-\u9fa5]
27 、雙位元組字元:
[^\x00-\xff]
(包括漢字在內,可以用來計算字串的長度(一個雙字節字元長度計2,ASCII字元計1))
28 、空白行的正規表示式:\n\s*\r (可以用來刪除空白行)
29 、HTML標記的正規表示式:
<(\S*?)[^>]*>.*?\1>|<.*? /> ; (網上流傳的版本太糟糕,上面這個也僅僅能部分,對於複雜的嵌套標記依舊無能為力)
30 、首尾空白字符的正則表達式:^\s*|\s*$或(^ \s*)|(\s*$) (可以用來刪除行首行尾的空白字元(包括空格、製表符、換頁符號等等),非常有用的表達式)
31 、騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
32 、中國郵遞區號:[1-9]\d{5}(?!\d) (中國郵遞區號為6位數字)
33、 IP位址:\d \.\d \.\d \.\d (提取IP位址時有用)
以上是php正規的內容摘要(詳細)的詳細內容。更多資訊請關注PHP中文網其他相關文章!