php爬虫技术3


正则表达式展示

    /[a-zA-z]+://[^\s]*/                //匹配URL
    /^((https|http|ftp)?://)[^\s]+/     //匹配URL和FTP
    /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/     //匹配URL协议、域、端口及相对路径
    /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/    //匹配邮箱地址

正则表达式(结构)

1. 原子
2. 元字符
3. 修正符
4. 预定义字符
5. 特殊字符
6. 分组符
7. 界定符
8. 修正符
9. 正则表达式优先级

一、原子

原子 描述
普通字符 可打印的字符,在屏幕可看到的字符,如大小写字母、数字等
非打印字符 即存在但不可显示字符,如回车、换行、制表符等
自定义字符 可以是一个,也可以是集合,用方括号'[ ]'包起来

1.普通字符

示例 描述
a-z 匹配单个小写字母
A-Z 匹配单个大写字母
0-9 匹配单个数字

代码示例:

    $pattem = '/a/';
    $subject = '11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

2.非打印字符

示例 描述
\n 匹配一个换行符,等价于:\x0a
\r 匹配一个回车符,等价于:\x0d
\f 匹配一个换页符,等价于:\x0c
\t 匹配一个制表符,等价于:\x09
\v 匹配一个垂直制表符,等价于:\x0b

代码示例:

    $pattem = '/\n/';
    $subject = '11112222333344445555666677778888999900000 
    aaabbbcccdddeeefffggghhhiiijjjjkkkk';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

3.自定义字符

示例 描述
[1234] 匹配1、2、3、4数字
[0-9] 匹配数字集合
[a-z] 匹配小写字母集合
[A-Z] 匹配大写字母集合
[0-9a-zA-Z] 匹配数字、小写字母、大写字母集合

代码示例:

    $pattem = '/[a-z]/';
    $subject = '11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

二、元字符

( . ) 括号里的匹配符,匹配除换行符之外的任意一个字符

示例 描述
12. 匹配两个数字,在加任意一个字符
zhu. 匹配两个小写字母,在加任意一个字符
OU. 匹配两个大写字母,在加任意一个字符

代码示例:

    $pattem = '/12./';
    $subject = '11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk OUYANGKE OUYANGKE zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( | ) 括号里的匹配符,匹配2个或多个分支

示例 描述
12|67 匹配12和67
ou|zhu 匹配ou和zhu

代码示例:

    $pattem = '/12|67/';
    $subject = '11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( [ ] ) 括号里的匹配符,匹配方括号内指定的任意一个原子

示例 描述
[1234] 匹配1、2、3、4数字
[0-9] 匹配数字集合
[a-z] 匹配小写字母集合
[A-Z] 匹配大写字母集合
[0-9a-zA-Z] 匹配数字、小写字母、大写字母集合

代码示例:

    $pattem = '/[1234]/';
    $subject = '11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( [^ ] ) 括号里的匹配符, 匹配除方括号内指定原子以外的任意一个原子

示例 描述
[^1234] 匹配去除1、2、3、4数字
[^0-9] 匹配去除数字集合
[^a-z] 匹配去除小写字母集合
[^A-Z] 匹配去除大写字母集合
[^0-9a-zA-Z] 匹配去除数字、小写字母、大写字母集合

代码示例:

    $pattem = '/[^1234]/';
    $subject = '11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( ^ ) 括号里的匹配符,匹配字符串开始位置,一串字符串,必须从这里开始

示例 描述
^1 匹配从1数字开始
^[0-9] 匹配从数字集合开始
^[a-z] 匹配从小写字母集合开始
^[A-Z] 匹配从大写字母集合开始
^[0-9a-zA-Z] 匹配从数字、小写字母、大写字母集合开始

代码示例:

    $pattem = '/^[a-z]/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( $ ) 括号里的匹配符,匹配字符串结束位置

示例 描述
[0-9]$ 匹配从数字集合结束
[a-z]$ 匹配从小写字母集合结束
[A-Z]$ 匹配从大写字母集合结束
[0-9a-zA-Z]$ 匹配从数字、小写字母、大写字母集合结束

代码示例:

    $pattem = '/[a-z]$/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

三、量词(限定符)

{n} 表示前面原子出现n次

示例 描述
[0-9]{3} 匹配从数字连续出现3次
[a-z]{3} 匹配从小写字母集合连续出现3次
[A-Z]{3} 匹配从大写字母集合连续出现3次
[0-9a-zA-Z]{3} 匹配从数字、小写字母、大写字母集合连续出现3次

代码示例:

    $pattem = '/[0-9]{3}/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

{n,} 表示前面原子出现不少于n次

示例 描述
[0-9]{1,} 匹配从数字连续出现1次或多次
[a-z]{1,} 匹配从小写字母集合连续出现1次或多次
[A-Z]{1,} 匹配从大写字母集合连续出现1次或多次
[0-9a-zA-Z]{1,} 匹配从数字、小写字母、大写字母集合连续出现1次或多次

代码示例:

    $pattem = '/[0-9]{1,}/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

{n,m} 表示前面原子至少出现n次,最多出现m次

示例 描述
[0-9]{1,3} 匹配从数字连续出现1次或3次
[a-z]{1,3} 匹配从小写字母集合连续出现1次或3次
[A-Z]{1,3} 匹配从大写字母集合连续出现1次或3次
[0-9a-zA-Z]{1,3} 匹配从数字、小写字母、大写字母集合连续出现1次或3次

代码示例:

    $pattem = '/[0-9]{1,3}/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( * ) 匹配0次、1次或多次前面原子

示例 描述
[0-9]* 匹配从数字连续出现0次、1次或多次
[a-z]* 匹配从小写字母集合连续出现0次、1次或多次
[A-Z]* 匹配从大写字母集合连续出现0次、1次或多次
[0-9a-zA-Z]* 匹配从数字、小写字母、大写字母集合连续出现0次、1次或多次

代码示例:

    $pattem = '/[0-9]*/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( + ) 匹配1次或多次前面原子

示例 描述
[0-9]+ 匹配从数字连续出现1次或多次
[a-z]+ 匹配从小写字母集合连续出现1次或多次
[A-Z]+ 匹配从大写字母集合连续出现1次或多次
[0-9a-zA-Z]+ 匹配从数字、小写字母、大写字母集合连续出现1次或多次

代码示例:

    $pattem = '/[0-9]+/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

(?) 匹配0次或1次前面原子

示例 描述
[0-9]? 匹配从数字连续出现0次或1次
[a-z]? 匹配从小写字母集合连续出现0次或1次
[A-Z]? 匹配从大写字母集合连续出现0次或1次
[0-9a-zA-Z]? 匹配从数字、小写字母、大写字母集合连续出现0次或1次

代码示例:

    $pattem = '/[0-9]?/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

四、预定义字符

\d 匹配任意一个十进制数

代码示例:

    $pattem = '/\d/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

\D 匹配任意一个除十进制以外的字符

代码示例:

    $pattem = '/\D/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

\w 匹配任意一个字母/数字/下划线字符

代码示例:

    $pattem = '/\w/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

\W 匹配任意一个除字母/数字/下划线之外的字符

代码示例:

    $pattem = '/\W/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

\s 匹配任意一个空白字符(非打印)

代码示例:

    $pattem = '/\s/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

\S 匹配任意一个除空白字符以外的字符

代码示例:

    $pattem = '/\S/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

\b 匹配单词边界

代码示例:

    $pattem = '/ouyangke\b/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

\B 匹配除单词边界以外的部分

代码示例:

    $pattem = '/yang\B/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

五、特殊字符

代码示例:

    $pattem = '/ \+ /';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk * + ? . | ^ $ [ ] ( ) ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

六、分组符

代码示例:

    $pattem = '/(欧阳克|朱老师)|([0-9])/';
    $subject = '我是欧阳克 我是朱老师 asdfsdf212fdhdfgh54674fghjfghjk78907dfghdfghdfgh';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

七、界定符

/ / 符号是正则表达式的界定符,里面包裹正则表达式。


八、修正符(在界定符后面)

多个修正符可以组合在一起使用

( U ) 表示取消贪婪模式

代码示例1:

    $pattem = '/ou.*/';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

代码示例2:

    $pattem = '/ou.*/U';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk ouyangke ouyangke zhulaoshi zhulaoshi';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( i ) 表示和模式进行匹配时忽略大小写

代码示例:

    $pattem = '/ouyangke/i';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk OUYANGKE OUYANGKE ZHULAOSHI ZHULAOSHI';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( s ) 被匹配的字符串将视为一行来看,包括换行符,换行符将被视为普通字符串。

代码示例:

    $pattem = '/OUYANGKE./s';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk\n OUYANGKE
OUYANGKE
ZHULAOSHI ZHULAOSHI';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

( x ) 模式中的空白忽略不计

代码示例:

    $pattem = '/   0
    0
    0/x';
    $subject = 'a11112222333344445555666677778888999900000 aaabbbcccdddeeefffggghhhiiijjjjkkkk\n OUYANGKE OUYANGKE ZHULAOSHI ZHULAOSHI';
    $a = preg_match_all($pattem,$subject,$matches);
    var_dump($a);   // 输出匹配次数
    var_dump($matches); // 输出匹配结果

九、正则表达式优先级(1级最大)

级别 符号 解释
1 \ 转义字符
2 ( )、 ( ?: )、 ( ?= )、 [ ]、 模式单元与原子表
3 *、 +、 ?、 {n}、 {n,}、 {n,m} 重复匹配
4 ^、 $、 \b、 \B 边界匹配
5 | 模式选择