正则表达式,写起来还是比较费劲的,于是封装个类,初稿,抛砖引玉。

关于正则,建议参考 https://github.com/CyC2018/CS-Notes/blob/master/notes/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.md

class Pattern {

    public $pattern = '';

    public static function init(){

        return new static();
} public function start($char){ $this->pattern .= '^' . $char;
return $this;
} public function end($char){ $this->pattern .= $char . '$';
return $this;
} //匹配次数
public function count($range = null){ if(is_array($range)) $range = implode(',', $range); if(is_numeric($range) || strpos($range, ',') ) $range = '{' . $range . '}';
$this->pattern .= $range; return $this;
} public function match($pattern, $get = true){ $this->pattern .= '(' . ($get ? '' : '?:'). $pattern . ')';
return $this;
} //转义
public function escape($char){ $this->pattern .= '\\' . $char;
return $this;
} public function append($string, $comment = null){ $this->pattern .= $string;
//$this->pattern .= $string . ($comment ? '(?#'. $comment .')' : '');
return $this;
} public function flush(){ $pattern = $this->pattern;
$this->pattern = ''; return $pattern;
} public static function help(){ $help = <<<'help'
[\b] => 单词边界
[\B] => 非单词边界
[\cx] => x 指明的控制字符,值必须为 A-Z 或 a-z 之一
[\d] => 数字,[0-9]
[\D] => 非数字,[^0-9]。
[\f] => 换页符,等价于 \x0c 和 \cL
[\n] => 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
[\r] => 回车符,等价于 \x0d 和 \cM
[\s] => 空白字符,等价于 [\f\n\r\t\v]
[\S] => 非空白字符,等价于 [^\f\n\r\t\v]
[\t] => 水平制表符,等价于 \x09 和 \cI
[\v] => 垂直制表符。等价于 \x0b 和 \cK
[\w] => 字母、数字、下划线,等价于 [A-Za-z0-9_]
[\W] => 非字母、非数字、非下划线。等价于 [^A-Za-z0-9_]
[\xn] => 匹配某个十六进制表示的字符,值必须为确定的两个数字长。\x41B 表示 AB
[\num] => 对所获取的匹配的引用,"(.)\1" 匹配两个连续的相同字符
[\nm] => 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm
[\nml] => 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
[\un] => n 是四个十六进制数字表示的 Unicode 字符
help;
echo $help; } //正向查找
public function forward($string, $positive = true){ $this->pattern .= '(?' . ($positive ? '=' : '!') . $string . ')'; return $this; } //反向查找
public function backward($string, $positive = true){ $this->pattern .= '(?<' . ($positive ? '=' : '!') . $string . ')'; return $this; } public function exec($mode = null){ $mode = $mode ? $mode : '';
$pattern = '/' . $this->pattern . '/' . $mode; return $pattern;
} //条件查找
public function condition($condition, $string){ $this->pattern .= '(?(' . $condition. ')'. $string .')'; return $this;
} } $html = "<b>example: </b><div align=left>this is a test</div>"; $pattern = Pattern::init()->append('<(\w+?)', '标签名')
->append('\s*?', '空格')
->append('.*?>','属性')
->append('.*?', '内容')
->append('<\/\1>', '回溯引用标签名')
->exec(); echo $pattern . "\n";
preg_match_all($pattern, $html, $out);
print_r($out);

PHP生成正则表达式的类的更多相关文章

  1. JAVA自动生成正则表达式工具类

    经过很久的努力,终于完成了JAVA自动生成正则表达式工具类.还记得之前需要正则,老是从网上找吗?找了想修改也不会修改.现在不用再为此烦恼了,使用此生成类轻松搞定所有正则表达式.赶快在同事面前炫一下吧. ...

  2. C#正则表达式Regex类的用法

    C#正则表达式Regex类的用法 更多2014/2/18 来源:C#学习浏览量:36891 学习标签: 正则表达式 Regex 本文导读:正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串, ...

  3. WCF通过SVCUtil.exe生成客户端代理类和配置文件(转)

    WCF服务调用通过两种常用的方式: 1:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式. 2:一种是通过ChannelFactory直接创建服务代理对象进行服务调用. 本文只针对通 ...

  4. Android 自动生成的R类

    资源文件的使用分为在代码中使用和在其他资源文件中引用该资源文件.在我们编译一个Android应用时,Android会自动生成一个R类,在该类中根据不同的资源类型又生成了相应的内部类,该类包含了系统中使 ...

  5. 解析利用wsdl.exe生成webservice代理类的详解

    利用wsdl.exe生成webservice代理类:根据提供的wsdl生成webservice代理类1.开始->程序->Visual Studio 2005 命令提示2.输入如下红色标记部 ...

  6. MyEclipse自动生成hibernate实体类和配置文件攻略

    步骤1:找到导航栏里面的window--showView然后输入db brower,打开数据库浏览窗口步骤2:在数据库浏览窗口里只有一个Myeclipse自带的数据库,该数据没有用,我们在空白的地方右 ...

  7. eclipse从数据库逆向生成Hibernate实体类

    做项目必然要先进行数据库表设计,然后根据数据库设计建立实体类(VO),这是理所当然的,但是到公司里做项目后,让我认识到,没有说既进行完数据库设计后还要再“自己”建立一变VO.意思是,在项目设计时,要么 ...

  8. webservice 的wsdl文件生成客户端java类

    提供两个方法: 第一个: 发布webservice项目后, 地址栏地址  http://localhost:8888/lxitedu.webservice.cxf-ch2/services/userS ...

  9. T4教程2 T4模版引擎之生成数据库实体类

    T4模版引擎之生成数据库实体类   在通过T4模版引擎之基础入门 对T4有了初步印象后,我们开始实战篇.T4模板引擎可以当做一个代码生成器,代码生成器的职责当然是用来生成代码(这不是废话吗).而这其中 ...

随机推荐

  1. Python学习笔记之replace()

    10-2 可使用方法replace()将字符串中的特定单词都替换为另一个单词. 读取你刚创建的文件learning_python.txt 中的每一行,将其中的Python 都替换为另一门语言的名称,如 ...

  2. laravel框架之即时更改

    表单//@foreach($res as $k=>$v) <tr id="{{$v->id}}" > <td>{{$v->id}}< ...

  3. 【开发笔记】- Idea启动Gradle报错:Warning:Unable to make the module: reading, related gradle configuration was not found. Please, re-import the Gradle project and try again

    报错信息: Warning:Unable to make the module: reading, related gradle configuration was not found. Please ...

  4. element ui DatePicker 禁用当前日之前的时间

    <el-date-picker style="width:195px" value-format="yyyy-MM-dd" v-model="f ...

  5. Django模板系统:Template

    一.模板常用语法 1.1 变量 符号:{{ }} 表示变量,在模板渲染的时候替换成值 使用方式:{{ 变量名 }}:变量名由字母数字和下划线组成 点(.)在模板语言中有特殊的含义,用来获取对象的相应属 ...

  6. Django使用Mysql已存在数据表的方法

    在mysql数据库中已经存在有数据的表,自己又不想删除,下面方法可以同步django中创建的表 1.最好将自己建的表名改为前缀和django自动创建表名前缀相同,不改也可以,但是后期表太多容易混乱 2 ...

  7. tensorflow运行时错误:服务似乎挂掉了,但是会立刻重启的.

    以前在POD里跑起来,没问题的示例代码. 移到jupyter中,多给两个GPU,有时运行就会爆出这个错误: 于是,按网上的意见,暂时加了个使用GPU的指定, 暂时搞定. 如下红色部分. import ...

  8. GitHub的SSH key配置以及常用的git命令介绍

    一. GitHub的SSH key配置 (以windows为例,Mac iOS系统类似) SSH Key 是一种方法来确定受信任的计算机,从而实现免密码登录.Git是分布式的代码管理工具,远程的代码管 ...

  9. 201871010107-公海瑜《面向对象程序设计(Java)》第四周学习总结

       201871010107-公海瑜<面向对象程序设计(Java)>第四周学习总结          项目                                         ...

  10. mybatis框架-resultMap的自动映射级别-partial 和full的探讨

    现在我们做一个小实验,输出一下上一个案例中没有匹配的属性,注意哦,现在user类中是有内部嵌套的复杂数据类型的 运行结果: 注意到:现在居然连userPassword都打印不出来了,原因就是user类 ...