正则基础入门

####1,元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

####2,重复

*       重复零次或更多次
+       重复一次或更多次
?       重复零次或一次
\{n\}   重复 n 次
\{n,\}  重复 n 次或更多次
\{n,m\} 重复 n 次到 m 次

####3,常用的反义

\W       匹配任意不是字母,数字,下划线,汉字的字符 
\S       匹配任意不是空白符的字符
\D       匹配任意非数字的字符
\B       匹配不是单词开头或结束的位置
[^x]     匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

#####练习1 验证$eamil的合法性

$email = array('12345678@qq.com','1212121212.com','hahahaha','Asw@zj.gov.cn','Asw@zj.info');

$pattern = '/^[a-z0-9_]+@(?:[a-z0-9_-]+\.)+(?:com|cn)/i'; // (exp)匹配并捕获 (?:exp)匹配

foreach ($email as $key => $value) {
    if(preg_match($pattern, $value)){
        echo $value , ' pass' , PHP_EOL;
    }else{
        echo $value , ' fail' , PHP_EOL;
    }
    //preg_match($pattern, $value , $RESULT[$key]);
}
var_dump($RESULT);

输出:

444371889@qq.com pass
1212121212.com fail
hahahaha fail
Asw@zj.gov.cn pass
Asw@zj.info fail

#####练习2 匹配出正确的时间

$str = "
13:00
212:36w ww22:48kl
4:32  这样的时间应该是正确的
22:00
23:59
22:61
1112:13 非法
43:33 非法
12:60
12:33
000:34
00:00
23:59
24:59 显然没有这样的时间
24:00
30
";

$pattern = '/[0-2]{1}[0-3]{1}:[0-5]{1}[0-9]{1}/';

preg_match_all($pattern, $str , $res);

var_dump($res);

输出:

array(1) {
[0]=>
    array(10) {
    [0]=>
    string(5) "13:00"
    [1]=>
    string(5) "12:36"
    [2]=>
    string(5) "22:48"
    [3]=>
    string(5) "22:00"
    [4]=>
    string(5) "23:59"
    [5]=>
    string(5) "12:13"
    [6]=>
    string(5) "12:33"
    [7]=>
    string(5) "00:34"
    [8]=>
    string(5) "00:00"
    [9]=>
    string(5) "23:59"
    }
}

可是我们并没有 “4:32 这样的时间应该是正确的” 这个正确的时间

是时候用到分支了

$pattern = '/[0-2]{1}[0-9]{1}:[0-5]{1}[0-9]{1}|[0-9]{1}:[0-5]{1}[0-9]{1}/';

注意 匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
举例:

\d{5}-\d{4}|\d{5} //匹配类似 23843-3234 或 21234 美国邮编格式 
//美国邮编的规则是5位数字,或者用连字号间隔的9位数字

如果你把它改成\d{5}|\d{5}-\d{4}的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。

####取反义

<a[^>]+>

匹配用尖括号括起来的以a开头的字符串。
匹配以 除 a 标签以外的标签

#匹配以 除 a 标签以外的元素
$str = '<a>baidu</a> 
    <a href="http://baidu.com"></a> 
    <a href="baidu.com"></a> 
    <span>baidu</span> 
    <div>hahahaha</div> 
    <font color="red">121</font>';

$pattern = '/<[^a\/].*/i';
preg_match_all($pattern, $str, $matches);

var_dump($matches);

输出:

array(1) {
[0]=>
    array(3) {
        [0]=>
        string(19) "<span>baidu</span> "
        [1]=>
        string(20) "<div>hahahaha</div> "
        [2]=>
        string(28) "<font color="red">121</font>"
    }
}

####后向引用
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本,举例:

从字符串中找出重复出现的单词

$str = 'hello kit kit , let`s go to play basketball , go go go';

$pattern = '/\b(\w+)\b\s+\1\b/i';

preg_match_all($pattern, $str, $matches);

var_dump($matches);

输出:

array(2) {
[0]=>
    array(2) {
    [0]=>
    string(7) "kit kit"
    [1]=>
    string(5) "go go"
}
[1]=>
    array(2) {
    [0]=>
    string(3) "kit"
    [1]=>
    string(2) "go"
}
}

####常用分组语法

捕获 (exp) 匹配exp,并捕获文本到自动命名的组里

捕获 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)

捕获 (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号

正则测试工具

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值