首頁 >後端開發 >php教程 >php正規的內容摘要(詳細)

php正規的內容摘要(詳細)

不言
不言轉載
2019-02-15 12:00:205315瀏覽

這篇文章帶給大家的內容是關於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字表符

括號字元()

在正規表示式中小括號的作用主要有:


改變限定符如( |、* 、^)的作用範圍 

如(my|your)baby,如果沒有”()”,|將匹配的是要么是my,要么是yourbaby,有了小括號,匹配的就是mybaby或yourbaby。

進行分組,以便於反向引用

模式修飾符

#模式修飾符的作用是設定模式,也就是正規表示式如何解釋。 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":

<?php
//模式分隔符后的"i"标记这是一个大小写不敏感的搜索
if (preg_match("/php/i", "PHP is the web scripting language of choice."))
{
echo "查找到匹配的字符串 php。";
} else {
echo "未发现匹配的字符串 php。";
} ?>

執行結果如下所示:

查找到匹配的字符串 php。

尋找單字"word"

<?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";
} ?>

執行結果如下所示:

查找到匹配的字符串。
未发现匹配的字符串。

取得URL 中的網域名稱

<?php
// 从URL中获取主机名称
preg_match(&#39;@^(?:http://)?([^/]+)@i&#39;, "http://www.runoob.com/index.html", $matches);
$host = $matches[1];
// 获取主机名称的后面两部分
preg_match(&#39;/[^.]+\.[^.]+$/&#39;, $host, $matches);
echo "domain name is: {$matches[0]}\n";
?>

執行結果如下所示:

domain name is: runoob.com

c.preg_match_all() 函數

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。

實例

尋找符合a4b561c25d9afb9ac8dc4d70affff419 與0d36329ec37a2cc24d42c7229b69747a 標籤的內容:(自己常用取得$pat_array[1])

<?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>
)

d. preg_replace() 函數

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。

实例

将 google 替换为 runoob

<?php
$string = &#39;google 123, 456&#39;;
$pattern = &#39;/(\w+) (\d+), (\d+)/i&#39;;
$replacement = &#39;runoob ${2},$3&#39;;
echo preg_replace($pattern, $replacement, $string);
?>

执行结果如下所示:

runoob 123,456

删除空格字符

<?php
$str = &#39;runo o b&#39;;
$str = preg_replace(&#39;/\s+/&#39;, &#39;&#39;, $str);
// 将会改变为&#39;runoob&#39; echo $str;
?>

执行结果如下所示:

runoob

使用基于数组索引的搜索替换

<?php
$string = &#39;The quick brown fox jumped over the lazy dog.&#39;;
$patterns = array();
$patterns[0] = &#39;/quick/&#39;;
$patterns[1] = &#39;/brown/&#39;;
$patterns[2] = &#39;/fox/&#39;;
$replacements = array();
$replacements[2] = &#39;bear&#39;;
$replacements[1] = &#39;black&#39;;
$replacements[0] = &#39;slow&#39;;
echo preg_replace($patterns, $replacements, $string);
?>

执行结果如下所示:

The bear black slow jumped over the lazy dog.

使用参数 count

<?php
$count = 0;
echo preg_replace(array(&#39;/\d/&#39;, &#39;/\s/&#39;), &#39;*&#39;, &#39;xp 4 to&#39;, -1 , $count);
echo $count; //3
?>

执行结果如下所示:

xp***to
3

e.preg_split() 函数

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 = &#39;runoob&#39;;
$chars = preg_split(&#39;//&#39;, $str, -1, PREG_SPLIT_NO_EMPTY);
print_r($chars);
?>

执行结果如下所示:

Array
(
    [0] => r
    [1] => u
    [2] => n
    [3] => o
    [4] => o
    [5] => b
)

分隔一个字符串并获取每部分的偏移量

<?php
$str = &#39;hypertext language programming&#39;;
$chars = preg_split(&#39;/ /&#39;, $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
        )

)

3.常用正则(参考作用)

一、校验数字的表达式 

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標記的正規表示式:
706b83c79d2c696ac46a98098db7b11b]*>.*?c0f8603dd44f0db5dcc943cf687721b3|<.*? /> ; (網上流傳的版本太糟糕,上面這個也僅僅能部分,對於複雜的嵌套標記依舊無能為力)
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中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除