PHP 正則表達式

PHP 正則表達式

1、正則表達式簡介

正則表達式是用於描述字符排列和匹配模式的一種語法規則。它主要用於字符串的模式分割、匹配、查找和替換操做。目前爲止,咱們前面所用過的精確(文本)匹配也是一種正則表達式。php

  • 在PHP中,正則表達式通常由正則字符和一些特殊字符(相似於通配符)聯合構成的一個文本模式的程序性描述。
  • 在PHP中,正則表達式有三個做用:1.匹配,經常使用於從字符串中析取信息 2.用新文本代替匹配文本 3.將一個字符串拆分爲一組更小的信息塊
  • 一個正則表達式中至少包含一個原子

2、兩套正則表達式函數庫

  1. PCRE庫(推薦):使用preg_爲前綴命名的函數;
  2. POSIX庫:使用ereg_爲前綴命名的函數

3、PCRE庫函數

函數名                        描述
----------------------|--------------------------
preg_match()          |    進行正則表達式匹配
preg_match_all()      |    進行全局正則表達式匹配
preg_replace()        |    執行正則表達式的搜索和替換
preg_split()          |    用正則表達式分割字符串
preg_grep()           |    返回與模式匹配的數組單元
preg_replace_callback |    用回調函數執行正則表達式的搜索和替換

4、使用場景

  1. 表單驗證
  2. url_rewrite (url地址重寫)
  3. 爬蟲

5、正則表達式的組成部分

1.定界符 (必須)
一般使用特殊字符組成,經常使用「/」。
2.原子(必須)
是正則表達式的最基本組成單元,並且在每一個模式中最少要包含一個原子。原子是由全部那些未顯示指定爲元字符的打印和非打印字符組成,具體分爲5類。正則表達式

  • 普通字符做爲原子:如a~z,A~Z,0~9。
  • 一些特殊字符和轉義後元字符做爲原子: \' \* \+ \? \.等。
  • 一些非打印字符做爲原子:如:f n r t v cx。
  • 使用「通用字符類型」做爲原子:如:d D w W s S。
  • 自定義原子表([ ])做爲原子:如:'/[apj]sp/'。

3.元字符
4.模式修正符數組

示例:函數

# 匹配一個字符a
$pattern = '/a/'; 

# 匹配字符a,若是有返回1,沒有返回0,只能匹配一次。
echo preg_match($pattern, '012344556'); 

# preg_match也可用於判斷
if(preg_match($pattern, "1232423423", $matches)) {
    echo "匹配到了<hr/>";
    # 並把匹配出來的字符以數組的形式賦值給$matches;
    # 打印結果:`array(1) {[0] => string(1) "a"}`;
    var_dump($matches);
}else {
    echo "沒有匹配";
}

元字符匹配:url

# 若是隻想匹配 `.`,特殊含義的字符要轉義。
$pattern = "/\./"

# 匹配非打印字符
$pattern = "/\n/"

# 匹配0-9數字
$pattern = "/\d/";
# 匹配除了0-9的數組
$pattern = "/\D/";

# 匹配數字+大小寫字母+下劃線
$pattern = "/\w/";
# 匹配除了數字、大小寫字母、下劃線
$pattern = "/\W/";

# 匹配空白符(換行、縮進、空格)
$pattern = "/\s/";
# 匹配除了空白符的字符
$pattern = "/\S/";

# `*` 表明匹配前面的原子出現0、一、或屢次
$pattern = "so*u";
# `+` 表明匹配前面的原子出現1次、或屢次
$pattern = "so+u";
# `?` 匹配前面的一個原子出現0次或者1次
$pattern = "hao?sou";

# 匹配除了換行符的任意字符
$pattern = "/./";

# `|`表明或者
$pattern = "/a|b|c/";

# 匹配前面的一個原子恰巧出現n次;
$pattern = "/hao{2}sou/";
# 匹配出現>=2次
$pattern = "/hao{2, }sou/";
# 匹配出現2-5次
$pattern = "/hao{2, 5}sou/";

# `^` 必須以該原子開頭
$pattern = "/^aaa/";

# `$` 必須以該原子結尾
$pattern = "/aaa$/";

# 嚴格模式
# 必須嚴格只能匹配aaa。
$pattern = "/^aaa$/";

# a | b | c
$pattern = "/[abc]/";
# 除了a,b,c
$pattern = "/[^abc]/";

# `()`能夠看作一個總體,還能夠作反向引用
# 好比要匹配協議頭爲http、https、ftp
$pattern = "/(http|https|ftp):\/\//";

# 匹配除了空白符的任意字符
$pattern = "/.*/";

# `.*`貪婪模式
$str = "<b>abc</b><b>abc</b>";
$pattern = "/<b>.*</b>/";
# `.*?`取消貪婪模式
$pattern = "/<b>.*?</b>/";
或:
$pattern = "/<b>.*</b>/U";

模式修正符:code

`i`表明ignore,忽略大小寫
`m`匹配多行
`.`修正.的換行符
`x`忽略正則表達式裏面的空白符
`D`取消$對\n的忽略
相關文章
相關標籤/搜索