php 正则生成,正则-编程语言调用代码的生成

功能介绍

给定一个正则,生成php的正则调用代码。

一般正则中都会或多或少的包含具体编程语言中的特殊字符,还需要考虑到具体语言中字符串的转义;

下面列出了一些常见的要考虑的情况:1. 语言是否支持多行字符串?

2. 是否有定界符?

3. 语言的正则引擎是否支持逆序环视?

4. 正则修正符?

具体场景

我们拿PHP做个例子:

写一个特殊字符覆盖比较全的正则,并写出他的PHP匹配代码:

要匹配的内容

'引用\/'

正则

'(.+?\\/)'

PHP匹配代码$contents = <<

'引用\/'

EOT;

if (preg_match('/

\'(.+?)\\\\\/\'/', $contents, $match)) {

var_dump($match);

}

注意: 上面的正则写到PHP代码中的时候,以下字符进行了转义:1. ' 单引号

2. / 定界符

3. \ 转义字符,这是个比较特殊的字符

实现思路

要实现一个可用的代码生成,无非就是要把上面提到的特殊字符给转义了;

本想要用正则再对正则的字符串转义,最后发现不太靠谱,越写越复杂;

记起之前看过的redis conf分析相关的代码之后,遂选择逐字判断字符,并对字符转义,效果不错;注意优先级!public function escape($value)

{

$chars = str_split($value);

$len = count($chars);

$result = '';

for ($i = 0; $i < $len; $i++) {

if ($chars[$i] === '\\' && $i < $len - 1) {

// 转义字符的判断优先级最高,可以避免 \' 正则的重复转义

$i++; // 跳过后面一个字符

if ($chars[$i] === '\\') {

$result .= '\\\\\\\\';

} else {

$result .= '\\' . $chars[$i];

}

} else if ($chars[$i] === '\'') {

// 单引号,php字符串边界

$result .= '\\\'';

} else if ($chars[$i] === '/') {

// / php正则定界符

$result .= '\\/';

} else {

$result .= $chars[$i];

}

}

return $result;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值