正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香...

为什么80%的码农都做不了架构师?>>>   hot3.png

正则入门

1.简介

What?

对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种处理逻辑:查找、替换、获取。

Why?

对规则的哲学表达,世界即规则;
打开一扇门的另外一枚钥匙:更快(速)、更高(明)、更强(大)。

How?

pattern.test()、preg_match、regexp.MatchString()、Pattern.compile()、p pattern.match、pattern.search()、悟道

2.语法

分隔符

分隔符可以使任意非字母数字、非反斜线、非空白字符,经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)。
/foo bar/  +php+  {php}  %[a-zA-Z0-9_-]%  /http:\/\//  #http://# 

元字符:方括号外使用

一些字符被赋予 特殊的涵义,使其不再单纯的代表自己,模式中的这种有特殊涵义的编码字符 称为 元字符。
\ ^ $ . [ ] | ( ) ? * + { } \ ^ -

    其中 ^ ? .\ 有多重意思。

元字符:方括号内使用 [:alpha:]

正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香..._第1张图片

元字符:方括号内使用 字符类型检测

正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香..._第2张图片

量词

    * {0,}  + {1,}  ? {0,1}

转义序列

    \a \cx \e \f \n \p{xx} \P{xx} \r \t \xhh \ddd \040 \7 \40 \11 \011 \0113 \113 \377 \81 \d \D \h \H \s \S \v \V \w \W \b \B \A \Z \z \G \K \Q \E \X

^ $

句点

.

可选路径

|

模式修饰符

    i m s x A D S U X J u

子组(子模式)

    子组通过圆括号分隔界定,并且它们可以嵌套。 
cat(arcat|erpillar|) 匹配 ”cat”, “cataract”, “caterpillar” 中的一个

重复/量词

    重复次数是通过量词指定的,可以紧跟在下面元素之后.
z{2,4} 匹配 ”zz”, “zzz”, “zzzz”

后向引用

    在一个字符类外面, 反斜线紧跟一个大于 0 (可能还有一位数)的数字就是一个到模式中之前出现的某个捕获组的后向引用。
(a|b\1)+ 匹配任意数量的 ”a” 组成的字符串以及 ”aba”, “ababba” 等

断言

    一个断言就是一个对当前匹配位置之前或之后的字符的测试(?<=(?

一次性子组

条件子组

注释

递归模式

性能

http://php.net/manual/zh/regexp.reference.onlyonce.php

3.案例

身份证号:\d{17}[\d|x]|\d{15} 

正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香..._第3张图片

4.注意事项

正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香..._第4张图片

5.PHP特色

正则表达式完成用户输入验证:表结构

 

 [
            'type' => INPUT_POST, 'filter' => FILTER_VALIDATE_REGEXP,
            'options' => ['options' => ['regexp' => '/^[[:alpha:]]{1,16}$/']]
        ],
        'module' => [
            'type' => INPUT_POST, 'filter' => FILTER_VALIDATE_REGEXP,
            'options' => ['options' => ['regexp' => '/^[[:alpha:]]{1,16}$/']]
        ],
        'controller' => [
            'type' => INPUT_POST, 'filter' => FILTER_VALIDATE_REGEXP,
            'options' => ['options' => ['regexp' => '/^[[:alpha:]]{1,16}$/']]
        ],
        'action' => [
            'type' => INPUT_POST, 'filter' => FILTER_VALIDATE_REGEXP,
            'options' => ['options' => ['regexp' => '/^[[:alpha:]]{1,16}$/']]
        ],
        'status' => [
            'type' => INPUT_POST, 'filter' => FILTER_VALIDATE_REGEXP,
            'options' => ['options' => ['regexp' => '/^[0-1]$/']]
        ],
        'name' => [
            'type' => INPUT_POST, 'filter' => FILTER_VALIDATE_REGEXP, 'lang' => true,
            'options' => ['options' => ['regexp' => '/^[[:alpha:]]{1,32}$/u']]
        ]
    ];

    public function __construct()
    {
        parent::__construct();
    }
}

//
foreach ($this->validate as $field => $filter) {
            $result = filter_input($filter['type'], $field, $filter['filter'], $filter['options']);
            if ($result === false || $result === null) {
                throw new \InvalidArgumentException('Field '.$field.' '.($filter['error'] ?? 'error.'));
            }
            $this->field[isset($filter['lang'])][$field] = $result;
}

 正则表达式完成查找本地文件夹、文件

 0) {
                $directory = array_merge($directory, $add);
            }
        }
        return array_merge([$dir], $directory);
    }

    public static function findFiles($dir, $extensions = '*.*')
    {
        $directory = self::findFolder($dir);
        $files = [];
        foreach ($directory as $v) {
            $add = glob($v . '/{' . $extensions . '}', GLOB_BRACE | GLOB_NOSORT);
            if (count($add) > 0) {
                $files = array_merge($files, $add);
            }
        }
        return $files;
    }
}

正则表达式完成跨平台跨语言跨终端下保持高度一致

[regexp]
core.zh='[\u4e00-\u9fa5]'
core.mb='[^\x00-\xff]'
core.email='\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}'
core.url='((https|http|ftp|rtsp|mms)?:\/\/)[^\s]+'
core.mobile='0?(13|14|15|17|18|19)[0-9]{9}'
core.phone='[0-9-()()]{7,18}'
core.int='[1-9]\d*'
core.float='[1-9]\d*.\d*|0.\d*[1-9]\d*'
core.qq='[1-9]([0-9]{5,11})'
core.postal='\d{6}'
core.ipv4='(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)\.(25[0-5]|2[0-4]\d|[0-1]\d{2}|[1-9]?\d)'
core.card='\d{17}[\d|x]|\d{15}'
core.date='\d{4}(\-|\/|.)\d{1,2}\1\d{1,2}'
core.name='[A-Za-z0-9_\-\u4e00-\u9fa5]+'

拥抱PHP C扩展Yaconf模块,把常用的、通用的业务配置参数,全部加到服务器中,随服务器启动常驻内存,代替传统的解析文件方式。

然后再根据配置到服务器中的正则信息遍历生成(*.js)N份给Android、iOS、WEB、NODE、JAVA等,一处产出,多处共用:跨语言、跨终端。

6.测试工具

  • http://leaverou.github.io/regexplained/
  • https://www.phpliveregex.com/
  • http://tool.chinaz.com/regex

正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香..._第5张图片

正则实战

1.IDE

正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香..._第6张图片

461585a9121baae96f21cbb6cff8e92c519.jpg

2.PHP

(.*?)

#is', "$1", '

?

', -1, $count); var_dump($data);//输出 1 var_dump($data, $count);//输出 ?

3.JS

'.PHP_EOL;
echo 'var Me = {regexp:{'.PHP_EOL;
$data = [];
foreach ($regexp['core'] as $key => $value) {
    $data[] = $key.':/'.$value.'/';
}
echo join(',', $data);
echo PHP_EOL.'}};'.PHP_EOL;
echo '';

3.//JS端正则案例

4.Redis

像LIKE %% 一样模糊匹配Redis key

➜  ~ redis-cli
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> keys *app*
 1) "ADMIN:table:hp_app_lang"
 2) "ADMIN:table:hp_app"

Linux批量删除Redis大量key

127.0.0.1:6379> redis-cli keys "key*" | xargs redis-cli del
127.0.0.1:6379> redis-cli -h 192.168.0.1 -p 6380 -a "password" keys "*key*" | xargs redis-cli -h 192.168.0.1 -p 6380 -a "password" del

Redis实现关系型数据库查询、分页

127.0.0.1:6379> SORT role_id_13 ALPHA GET user_id_*->email LIMIT 0 15
127.0.0.1:6379> SORT role_id_13 BY user_id_*->id DESC GET user_id_*->id GET user_id_*->email LIMIT 0 15

5.Mongo

db.products.find( { description: { $regex: /m.*line/, $options: 'i' } } )

6.MySQL

SELECT * FROM `user` WHERE `name` REGEXP 'd{4}'

7.产品

爬虫软件

迅速收集大数据,包括但不限于 天猫、京东、亚马逊...

  • https://github.com/letwang/spider/blob/master/config/spider.config_bag.php
  • PHP MySql 采集心得 采集技巧 多线程批量采集 安全采集 伪装采集 采集 采集天猫 淘宝

Nginx日志分析

  • PHP Apache Access Log 分析工具 拆分字段成CSV文件并插入Mysql数据库分析

正则技巧

通用技巧

  • 分析目标特征,抽象出规律,转化为程序思想
  • 尽量使用元字符匹配,清晰易懂
  • 使用线上正则工具模拟测试,迅速验证
  • QQ、微信、微博... 多与行业大佬圈子在一起

正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香..._第7张图片

经验分享

1.酷爱使用isu修饰符 .*?招牌动作 ()提取匹配,形成了1种执念

preg_replace('/

(.*?)<\/p>/isu', "$1", $subject);

2.酷爱和优秀的行业大佬圈一起,并收集行业顶尖的正则以备不时之需

preg_replace_callback(
    '/[[:upper:]]/',
    function ($v){return '_'.strtolower($v[0]);},
    'userTrustRemindApp'
);// 可以映射到 'user_trust_remind_app.php' 文件

3.能不用正则的时候就不要用正则,因为威力太大,一般人驾驭不了

可以使用上述提到的Ctype、Filter,PHP已经内置了很多常用方法

附录

  • 案例参考:https://github.com/letwang/HookPHP/
  • PHP正则:http://php.net/manual/zh/book.pcre.php
  • 类型检测:http://php.net/manual/zh/book.ctype.php
  • 数据过滤:http://php.net/manual/zh/book.filter.php
  • 正则区别:http://wjqe.blog.163.com/blog/static/1993845201272782511720/
  • 生成正则:http://tool.chinaz.com/tools/regexgenerate
  • 配置缓存:http://php.net/yaconf
  • Redis正则:http://redis.cn/commands/sort.html
  • Mongo正则:https://docs.mongodb.com/manual/reference/operator/query/regex/
  • Mysql正则:https://dev.mysql.com/doc/refman/8.0/en/regexp.html

转载于:https://my.oschina.net/cart/blog/3004380

你可能感兴趣的:(正则表达式实战-什么是正则表达式-正则表达式跨平台跨语言跨终端下如何保持高度一致-正则表达式性能-正则表达式提高工作效率-正则表达式在工作中具体使用场景-正则表达式的前生今世-正则表达式入门-正则真香...)