在之前的文章中為大家帶來了《學會使用PHP的List、each函數及配合》,主要講解了應該如何使用list函數和each函數以及兩者之間應該怎樣配合使用,相信大家已經掌握的差不多了,那麼本篇文章我們一起來看看PHP中的正規表示式。希望對大家有幫助!
正規表示式是一種邏輯公式,是用一開始宣告好的一些字元還有這些字元的組合,組成的一個“規定字串”,這個規定字串其實就是用來過濾字串的,可以理解為我們在登陸用戶的時候有時會要填寫驗證碼或者電話之類的這些特定的數據,這時候就要用到正則表達式。
正規表示式雖然看起來複雜,其實並不難,那接下來我們一起來看看吧。
正規表示式的定界符
#首先我們要學習的就是正規表示式的定界符,顧名思義,定界符就是確定正規表示式邊界的符號,定一個邊界,邊界以內就是正規表示式。同時正規表示式的定界符有規定:
定界符,不能使用a-zA-Z0-9\ 除此之外都可以使用。並且必須成對出現,有開始就有結束。
範例如下:
$正则表达式$ %正则表达式% /正则表达式/
其中我們需要注意的是/
是轉義字符,當我們正則中需要匹配/的時候,可以使用\轉義一下。如果覺得麻煩的話,可以直接使用其他的定界符例如:
$/$
正規表示式的原子
正規表示式的原子是正規表示式裡的最小單位,也就是我們需要配對的內容,在我們成立的整形額表達式中,最少也要有一個原子。
其實可以理解為,所有可見的不可見的字元都是原子,像是空格、回車、換行、0-9、標點符號、A-Za-z、中文這些都是原子。
preg_match() 函數
在詳細的講原子之前,我們要先了解一個函數,那就是preg_match
#PHP 中的preg_match() 函數可以根據定義的正規表示式對字串進行搜尋以及匹配。
語法格式如下:
preg_match ( string $正则 , string $字符串 [, array &$结果] )
根據$正則也就是我們定義的正規表示式,在匹配$字串,如果存在則傳回符合個數,然後把符合的結果放在$結果裡。如果沒有符合到結果那就回傳0。
我們透過範例來看一下:
<?php //定义一个变量叫a,作为我们定义的正则表达式。 $a = '/a/'; $b = 'abbcccddddeeeee'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
輸出結果:
由上述範例可以看出,我們定義了變數a,希望能夠匹配的是a,正好在$b中存在a,透過if else語句輸出成功了。
再來一個範例:
<?php //定义一个变量叫a,作为我们定义的正则表达式。 $a = '/fff/'; $b = 'abbcccddddeeeee'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
輸出結果:
#在上述範例中,希望符合到字串,但是$ b中不存在,所以沒有匹配成功,透過if else語句輸出為匹配成功。
知道了preg_match() 函數的基本用法之後我們可以和特殊標識的原子結合起來使用。
特殊標識的原子
\d
---符合一個0-9
#\D
---除了0-9以外的所有字元
#\w
---a-zA- Z0-9_
\W-
--除了0-9A-Za-z_以外的所有字元
#\s
---符合所有空白字元\n \t \r 空格
#\S
---符合所有非空白字符
[ ]
---指定範圍的原子
它們的具體用法給大家一個例子就明白了:
<?php $a = '/\d/'; $b = '人生自古谁无4'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
輸出結果:
在上述範例中,特殊標識的原子\d表示的就是0- 9的數字,那麼在需要匹配的$b中存在一個4,所以匹配成功。
<?php $a = '/\w/'; $b = '人生自古谁无死'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
輸出結果:
在上述實例中,特殊標識的原子\w表示的是a-zA-Z0-9_ ,在變數b中沒有對應的元素,所以輸出結果為未符合。
其中還有一個[^]
字元表示不符合指定區間的字元。
範例如下:
<?php $a = '/[^0-9A-Za-z_]/'; $b = 'abbccc122333'; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
輸出結果:
通过[^]字符匹配除0-9A-Za-z_以外的字符,未匹配到。
总结一下:
\w
---[a-zA-Z0-9_]
\W
---[^a-zA-Z0-9_]
\d
---[0-9]
\D
---[^0-9]
\s
---[ \t\n\f\r]
\S
---[^ \t\n\f\r]
正则表达式的元字符
在上面的示例中,我们能够看出通过匹配的话,只能匹配一个字符,但是在我们的日常使用中,通常会匹配多个字符,那这时候只通过我们的原子就不能达到我们的目的。就需要通过元字符来帮我们修饰原子,实现更多的功能。
*
---代表匹配前面的一个原子,匹配0次或者任意多次前面的字符。
+
---匹配一次或多次前面的一个字符
?
---前面的字符可有可无【可选】 有或没有
.
---更标准一些应该把点算作原子。匹配除了\n以外的所有字符 或者。注:它的优先级最低了。
^
---必须要以抑扬符之后的字符串开始
$
--- 必须要以$之前的字符结尾
\b
---词边界
\B
---非边界
{m}
---有且只能出现m次
{n,m}
---可以出现n到m次
{m,}
---至少m次,最大次数不限制
()
---改变优先级或者将某个字符串视为一个整体,匹配到的数据取出来也可以使用它
接下来我们通过一些例子来实例看一下这些元字符的使用:
<?php $a = '/\d+/'; $b = "爱你10000年"; if(preg_match($a, $b, $c)){ echo '匹配到了,结果为:'; var_dump($c); }else{ echo '没有匹配到'; } ?>
输出结果:
通过元字符+的添加,匹配到了多次字符,\d+中d是匹配数字,+则表示最少匹配一次前面的字符。
正则表达式的模式修正符
通过原子和元字符的了解,我们已经完成了正则表达式的入门,但是这仍然不能代表正则表达式的真正实力,如果我们只希望正则表达式匹配一部分应该怎么办?有些特殊情况依然需要处理,这时候我们就要用到正则表达式的模式修正符。
下面列举一些常用的模式修正符:
i 模式中的字符将同时匹配大小写字母.
m 字符串视为多行
s 将字符串视为单行,换行符作为普通字符.
x 将模式中的空白忽略.
A 强制仅从目标字符串的开头开始匹配.
D 模式中的美元元字符仅匹配目标字符串的结尾.
U 匹配最近的字符串.
它的用法如下:
/正则表达式/模式修正符
接下来我们通过一些实例来看一下它的使用:
<?php $a = '/ABC/i'; $b = '8988abc12313'; $c = '11111ABC2222'; if(preg_match($a, $b, $d)){ echo '匹配到了,结果为:'; var_dump($d); }else{ echo '没有匹配到'; } ?>
输出结果:
i可以让匹配的时候同时匹配大小写,那么接下来把匹配的$b换成$c试一下,我们看一下输出结果:
<?php $a = '/ABC/i'; $b = '8988abc12313'; $c = '11111ABC2222'; if(preg_match($a, $c, $d)){ echo '匹配到了,结果为:'; var_dump($d); }else{ echo '没有匹配到'; } ?>
输出结果:
推荐学习:《PHP视频教程》
以上是讓人心動的PHP的正規表示式基礎(圖例詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!