关于正则表达式中的零宽断言

问题描述:需要将字符串中的颜色、尺码分别匹配出来,不论颜色尺码的顺序。
字符串结构如下:

颜色分类:粉色【代购】;尺码:均码
主要颜色:象牙色【代购】;尺码:均码
尺码:free;颜色分类:米色【代购】
颜色分类:浅青色【代购】;尺寸:S
颜色分类:碳色

处理方案


$data =array(
    array('prd_nm','颜色分类:粉色【代购】;尺码:均码')
    ,array('prd_nm','主要颜色:象牙色【代购】;尺码:均码')
    ,array('prd_nm','尺码:free;颜色分类:米色【代购】')
    ,array('prd_nm','颜色分类:浅青色【代购】;尺寸:S')
    ,array('prd_nm','颜色分类:碳色')
    ,array('prd_nm','碳色')
    ,array('prd_nm','尺寸:S;碳色')
);
foreach( $data AS $key => $value )
{
    $order_item = array();
    preg_match_all( '/(?<=颜色分类:|主要颜色:)(.*?)(?=\Z|【|;)/', $value[1], $color);
    preg_match_all( '/(?<=尺码:|尺寸:)(.*?)(?=;|\Z)/', $value[1], $size);
   if(empty($color[0][0])){
         preg_match_all( '/(?<=;|;)(.*?)(?=\Z|【|;|;)/', $value[1], $color);
    }
   if(empty($color[0][0])){
        preg_match_all( '/^(.*?)(?=\Z|【|;|;)/', $value[1], $color);
    }
    $order_item['prd_org_color'] = isset($color[0][0]) ? $color[0][0] : '' ;
    $order_item['prd_org_size'] = isset($size[0][0]) ? $size[0][0] : '' ;
    //print_r($order_item);
    //均码,free,Free等统一格式为FREE
    if(!empty($order_item['prd_org_size']) && preg_match('/^(free|均码){1}/i', $order_item['prd_org_size']))
    {
        $order_item['prd_org_size'] = 'FREE';
    }
}
?>

知识点:

零宽断言:用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b,^,$那样用于指定一个位置,这个位置应该满足一定的条件(即断言)。也就是它匹配的内容不会保存到匹配结果中。

常用分组语法
分类 代码/语法 说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?’name’exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置。也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp
(?<=exp) 匹配exp后面的位置。也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。
(?!exp) 匹配后面跟的不是exp的位置。也叫零宽度负预测先行断言,它断言自身出现的位置的后面不可以匹配后面跟的表达式exp。
(? 匹配前面不是exp的位置。也叫零宽度负回顾后发断言,它断言自身出现的位置的后面不可以匹配后面跟的表达式
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

参考资料:
1.正则表达式30分钟入门教程
2.正则表达式中零宽断言的用法

你可能感兴趣的:(正则表达式,正则表达式)