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

关于正则,建议参考 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. Object.freeze

    Object.freeze() 方法可以冻结一个对象.一个被冻结的对象再也不能被修改:冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性, ...

  2. 实体类id的几种生成方式

    @Id// @GeneratedValue(strategy = GenerationType.AUTO) // 自增// @GeneratedValue(strategy = GenerationT ...

  3. Android源码分析(八)-----系统启动流程&IPC简述

    一 :系统启动流程图 从下往上依次启动linux kernel -->zygote-->SystemServer-->NativeService-->AndroidServic ...

  4. JavaScript深入浅出第3课:什么是垃圾回收算法?

    摘要: JS是如何回收内存的? <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一 ...

  5. MYSQL性能测试工具SYSBENCH

    [root@localhost ~]$ wget https://github.com/akopytov/sysbench/archive/1.0.zip -O "sysbench-1.0. ...

  6. 160--Intersection Of Two Linked List

    public class IntersectionOfTwoLinkedList { /* 解法一:暴力遍历求交点. 时间复杂度:O(m*n) 空间复杂度:O(1) */ public ListNod ...

  7. 修改ceph的IP地址

    目录 修改步骤如下 1.导出mon配置 2.修改mon配置 3.修改ceph的配置文件 4.关闭ceph集群(建议将集群内的所有节点中的ceph都关闭) 5.修改服务器IP 6.导入修改后的mon 7 ...

  8. 配置以https访问网站

    环境 centos7  nginx1.16.1 一.申请证书(已有域名) 进入阿里云控制台,点击域名(我已经弄好了,一开始是没有ssl选项) 点击免费开启ssl 点购买->选择免费版 购买成功后 ...

  9. [转]【response】HttpServletResponse接口

    创建时间:6.19 & 6.24 1.HttpServletResponse概述 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参 ...

  10. Java 获取对象全部属性 包括 父类属性

    今天由于业务需要,看一段数据库中的表转化成用户可以看懂的数据,也就是把一些字段比如Date用ms存的,转化为'yyyy-MM-dd'这种格式,但是由于字段太多,所以利用Java反射机制自带的BeanU ...