PHP正则表达式

随堂练习

正则

什么是正则表达式

正则表达式就是一套专门用于处理文本的强大工具,可以对进行文本查找,匹配,替换;
正则表达式常用于验证表单提交的内容,比如验证电话号码,Email地址,身份证号码等是否有效;

Perl风格
  PCRE全称为Perl Compatible Regular Expression,意思是Perl兼容正则表达式。
  Perl兼容的正则表达式必须包含在定界符中,除数字、字幕、反斜线外的任何字符后可以作为定界符,
  另外,如果定界符要出现在表达式中需要使用转义符转义

Perl 兼容正则表达式函数

preg_match

进行正则表达式匹配

preg_match("/hello/", "hello world", $res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(5) "hello"
}

preg_match_all

匹配全局正则表达式匹配

preg_match_all("/h/", "hello hello", $res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(1) "h"
    [1]=>
    string(1) "h"
  }
}

preg_replace

执行正则表达式的搜索和替换

$res = preg_replace("/hello/","aaaa","hello world");

var_dump($res);

// 输出结果:
string(10) "aaaa world"

preg_split

用正则表达式分割字符串

$str = 'hypertext hanguage hrogramming';

$chars = preg_split('/ /', $str);

var_dump($chars);

// 输出结果:
array(3) {
  [0]=>
  string(9) "hypertext"
  [1]=>
  string(8) "hanguage"
  [2]=>
  string(11) "hrogramming"
}

元字符(特殊字符)

*

匹配前面的字符零次或多次,等同于{0,}

preg_match("/a*/","bbbbbaaa",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(0) ""
}

+

匹配前面的字符一次或多次,等同于{1,}

preg_match('/a+/','bbbbbbbbbbaa',$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(2) "aa"
}

?

匹配前面的字符零次或一次,等同于{0,1}

preg_match("/a?/","aaaabbbb",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(1) "a"
}

|

匹配两个或多个选择

preg_match("/(h|a)+/","dfghsssssasfgdsf",$res); 

var_dump($res);

// 输出结果:
array(2) {
  [0]=>
  string(1) "h"
  [1]=>
  string(1) "h"
}

^

匹配字符串的开始位置

preg_match("/^hello/","hello world",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(5) "hello"
}

$

匹配字符串结束位置

preg_match("/^hello world$/","hello world",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(11) "hello world"
}

\b

匹配单词的边界(如空格、横杠,但不包括下划线) 更简单点说\b匹配特殊字符

preg_match("/hello\b/","hello-world",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(5) "hello"
}

\B

匹配除单词边界以外的部分 更简单点说\B匹配除了特殊字符以外的字符

preg_match("/hello\B/","hello_world",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(5) "hello"
}

[]

匹配方括号中的任一字符

preg_match("/[abcdf]/","aaaa -  bbbb - aaac",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(1) "a"
}

[^]

匹配除方括号中的字符外的任何字符

preg_match("/[^abcdf]/","asd",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(1) "s"
}

{m}

m 是一个非负整数。匹配确定的 m 次

preg_match('/\d{5}/','123456789',$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(5) "12345"
}

{m,}

m 是一个非负整数。至少匹配m 次

preg_match('/\d{3,}/','123456789',$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(9) "123456789"
}

{m,n}

最少匹配 m次且最多匹配 n次

preg_match('/\d{3,8}/','123456789',$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(8) "12345678"
}

()

表示一个整体

preg_match('/订单收款(.*)元/','订单收款900元',$res);

var_dump($res);

// 输出结果:
array(2) {
  [0]=>
  string(18) "订单收款900元"
  [1]=>
  string(3) "900"
}

.

匹配除换行之外的任何一个字符

preg_match('/.*/','123456789',$res);

var_dump($res);

// 输出结果:
preg_match('/.*/','123456789',$res);

var_dump($res);

预定义元字符

由于某些模式会反复用到,所以可以使用以下预定义类;

\d

匹配一个数字;等价于[0-9]

preg_match("/\d+/","asdasdasdad  3434",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(4) "3434"
}

\D

匹配除数字以外任何一个字符;等价于[^0-9]

preg_match("/\D+/","asdasdasdad  3434",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(13) "asdasdasdad  "
}

\w

匹配一个英文字母、数字或下划线;等价于[0-9a-zA-Z_]

preg_match("/\w+/","asdasdasdad  3434",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(11) "asdasdasdad"
}

\W

匹配除英文字母、数字和下划线以外任何一个字符;等价于[^0-9a-zA-Z_]

preg_match("/\W+/","asdasdasdad  3434",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(2) "  "
}

\s

匹配一个空白字符;等价于[\f\n\r\t\v]

preg_match("/\s+/","asdasdasdad  3434",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(2) "  "
}

\S

匹配除空白字符以外任何一个字符;等价于[^\f\n\r\t\v]

preg_match("/\S+/","asdasdasdad  3434",$res);

var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(11) "asdasdasdad"
}

匹配包含某个范围的字符

用"[start-end]"匹配包含某个范围的字符

[a-z] 匹配所有的小写字母
[A-Z] 匹配所有的大写字母
[a-zA-Z]  匹配所有的字母
[0-9] 匹配所有的数字
[0-9\.\-] 匹配所有的数字,句号和减号   

preg_match("^[a-z]+$^", "abc",$res); 
var_dump($res);

// 输出结果:
array(1) {
  [0]=>
  string(3) "abc"
}

模式修正符

模式修正符在正则表达式定界符之外使用

i

在和模式进行匹配时不区分大小写

preg_match("/hello/i","HELLO WORLD",$res);

var_dump($res);

m

将字符串视为多行

$str = 'bcd 
abc
cba';

preg_match_all('/^abc/m',$str,$arr);

var_dump($arr);

s

模式中的圆点元字符 .将匹配所有的字符,包括换行符

$str = 'adsadsa 
c';

preg_match_all('/a.*c/s',$str,$arr);

var_dump($arr);

x

模式中的空白忽略不计,除非已经转义

preg_match_all("/^    hello /x","hello",$res);

var_dump($res);

U

取消贪婪匹配

$pattern = '/<b>.*<\/b>/U';

$string = '<b>hello</b> <b>world</b> <b>php</b>';

preg_match($pattern,$string,$res);

var_dump($res);

常用的正则表达式

手机号验证

<?php
//正则表达式
header("Content-Type:text/html;charset=utf-8");
$tel = "13055859966";
//上面部分判断长度是不是11位
if (strlen($tel) == "11") {
  $reg = "/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$/";
  if (!preg_match($reg, $tel)) {
      echo "手机号不正确";
  }else {
      echo "手机号正确";
  }
} else {
  echo "长度必须是11位";
}
?>

邮政验证

<?php
//正则表达式
header("Content-Type:text/html;charset=utf-8");
$email = '17171226@qq.com';
if (!preg_match('/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/', $email)) {
    echo "邮箱不合法";
}else {
    echo "邮箱合法";
}
?>

url验证

<?php
$url = 'https://www.baidu.com';
$url = strtolower(trim($url ));
if(empty($url )) {
    echo "url格式不正确";
}
$match = '/^(http:\/\/)?(https:\/\/)?([\w\d\-]+\.)+[\w\-]+(\/[\d\w\-.\/?%&=]*)?$/';
if (!preg_match($match, $url)) {
    echo "url格式不正确";
}else{
    echo "url格式正确";
}

?>

用户名验证

<?php
//6-20位字符,必须以字母开头,只能包含数字、字母、下划线,不区分大小写
$username = "user11";
  $match = '/^[a-zA-Z_][a-zA-Z0-9-_]{5,19}$/';
  if (!preg_match($match, $username)) {
      echo "用户名格式不正确";
  }else{
    echo "用户名格式正确";
  }
?>

密码验证

<?php
    //6-16位字符,需包括数字与英文字母
    $pwd = "ddkjs3322";
    $match = '/^(?![0-9]+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,16}$/';
    if (!preg_match($match, $pwd)) {
        echo "密码格式不正确";
    }else{
        ehco "密码正确";
    }

?>

用正则表达式采集网站上的图片

采集图片的网址:http://desk.zol.com.cn/qiche/

用正则表达式采集小说网站的小说

采集小说的网址:http://book.zongheng.com/showchapter/984807.html

注意:有些网站防止恶意的访问,当某IP过于频繁访问该网站时会弹出验证码的窗口,验证是否是机器人。
上面的小说采集的案例里的网站就有这个验证,当出现采集不了时,那有可能触发到该验证了
powered by GitbookEdit Time: 2024-06-06 18:25:41